ASP.NET MVC之表单集合数据自动绑定到对象属性(集合)中
前言
之前没遇到过这个问题,在项目中遇到这个问题时想法挺好,按照流程走下去,结果事与愿违,于是开始探索着解决方案,接下来我们来看看这个问题,早已经明了的童鞋请绕道,此文仅供未遇到的童鞋提供一种解决方案。
话题
首先我们来看看整个问题的出现,介绍一下问题的背景。
- public class Blog
- {
- public string BlogName { get; set; }
- public string BlogAddress { get; set; }
- public List<Article> Article { get; set; }
- }
- public class Article
- {
- public string ArticleIntr { get; set; }
- public string ArticleName { get; set; }
- }
上述给出两个类,一个博客包含多篇文章取集合属性。
- public ActionResult Test(Blog b)
- {
- var articleList = new List<Article>() { new Article() { ArticleIntr = "asp.net mvc", ArticleName = "mvc" }, new Article { ArticleIntr = "WebAPi", ArticleName = "WebAPi Authentication" } };
- var blog = new Blog() { BlogName = "xpy0928", BlogAddress = "CreateMyself", Article = articleList };
- return View(blog);
- }
利用强类型视图渲染到页面
- @using FormToObjList.Models
- @model Blog
- @{
- Layout = null;
- }
- <script src="~/Scripts/jquery-1.10.2.min.js"></script>
- <script src="~/Scripts/bootstrap.min.js"></script>
- <link href="~/Content/bootstrap.min.css" rel="stylesheet" />
- <div style="width:700px;margin-left:200px;">
- <form action="test" method="post" enctype="multipart/form-data">
- <div style="float:left;">
- 博客地址:<input type="text" class="form-control" value="@Model.BlogAddress" /><br />
- 博客名称:<input type="text" class="form-control" value="@Model.BlogName" /><br />
- </div>
- <br />
- <div style="float:right;">
- <table>
- <tr>
- <th>序号</th>
- <th>文章介绍</th>
- <th>文章名称</th>
- </tr>
- @{
- var i = ;
- foreach (var article in Model.Article)
- {
- <tr>
- <td>@(++i)</td>
- <td><input type="text" class="form-control" value="@article.ArticleIntr" /></td>
- <td><input type="text" class="form-control" value="@article.ArticleName" /></td>
- </tr>
- }
- }
- </table>
- </div>
- <div style="clear:both;float:right;">
- <button class="btn btn-primary" type="submit">提交</button>
- </div>
- </form>
- </div>
到这里我们需要实现的是点击提交后将页面上所有的数据都添加到后台【Blog b】属性,着重强调的是获取到b中属性Article要有两条我们渲染的数据。
我们看看演示结果:
我们可以看到居然都为空,别着急,此时都会想到既然要获取到值,则文本的name属性要和类中的属性一一对应才是,说完就开干。
- 博客地址:<input type="text" name="BlogAddress" class="form-control" value="@Model.BlogAddress" /><br />
- 博客名称:<input type="text" name="BlogName" class="form-control" value="@Model.BlogName" /><br />
- <td><input type="text" name="ArticleIntr" class="form-control" value="@article.ArticleIntr" /></td>
- <td><input type="text" name="ArticleName" class="form-control" value="@article.ArticleName" /></td>
进行如上设置后我们再来看看结果:
恩,有点小忧伤,对于Article这个集合属性数据并未添加到其中去,这个就是我们需要解决的问题。到了这里我寻思着是不是不能用html标签,需要用mvc自己来渲染成html标签才行呢?也就是说利用【 @Html.TextBoxFor() 】来进行渲染,此时是个集合,则只能用for循环来进行遍历,于是乎将数据渲染时修改成下面的这个样子。
- @{
- var j = ;
- for (var i = ; i < Model.Article.Count; i++)
- {
- <tr>
- <td>@(++j)</td>
- <td>@Html.TextBoxFor(a => a.Article[i].ArticleIntr, new { @class="form-control"})</td>
- <td>@Html.TextBoxFor(a => a.Article[i].ArticleName, new { @class="form-control"})</td>
- </tr>
- }
- }
我们继续看看结果:
好了,我们终于得到我们想要的结果了,你是不是觉得就这么愉快的结束了呢?
实际需求
在项目中我们需要做的是添加,同时在页面开始时有几个默认的文本框且还需要动态添加行,这个时候我们又该如何做呢?我们一起来看看。
- @{
- if (Model.Article != null)
- {
- var j = ;
- for (var i = ; i < Model.Article.Count; i++)
- {
- <tr>
- <td>@(++j)</td>
- <td>@Html.TextBoxFor(a => a.Article[i].ArticleIntr, new { @class = "form-control" })</td>
- <td>@Html.TextBoxFor(a => a.Article[i].ArticleName, new { @class = "form-control" })</td>
- </tr>
- }
- }
- else
- {
- }
- }
如果默认没有值时,我们则需要自己添加默认的文本,此时该如何添加,我们想想当直接利用htm文本标签和利用Html.TextBoxFor渲染的效果有何不同?看看如下:
- //Html标签
- <input type="text" name="ArticleIntr" class="form-control" value="WebAPi">
- //Html.TextBoxFor()
- <input class="form-control" id="Article_1__ArticleIntr" name="Article[1].ArticleIntr" type="text" value="Angular">
这个时候我们恍然大悟,既然是集合那么name则是取到对应的索引值,我们照样画葫芦,于是我们修改成如下:
- @{
- if (Model.Article != null)
- {
- var j = ;
- for (var i = ; i < Model.Article.Count; i++)
- {
- <tr>
- <td>@(++j)</td>
- <td>@Html.TextBoxFor(a => a.Article[i].ArticleIntr, new { @class = "form-control" })</td>
- <td>@Html.TextBoxFor(a => a.Article[i].ArticleName, new { @class = "form-control" })</td>
- </tr>
- }
- }
- else
- {
- var j = ;
- for (var i = ; i < ; i++)
- {
- <tr id="trs">
- <td>@(++j)</td>
- <td><input type="text" name="Article[@i].ArticleIntr" class="form-control" /></td>
- <td><input type="text" name="Article[@i].ArticleName" class="form-control" /></td>
- </tr>
- }
- }
- }
动态添加时的操作:
- $("#btnAdd").on("click", function () {
- var trLen = $("#tb tr[id='trs']").length;
- var $lastTr = $("#tb tr[id='trs']").last();
- var tr = "<tr id='trs'>";
- tr += "<td>" + (trLen + ) + "</td>";
- tr += "<td><input type='text' name='Article[" + trLen + "].ArticleIntr' class='form-control' /></td>";
- tr += "<td><input type='text' name='Article[" + trLen + "].ArticleName' class='form-control' /></td>";
- tr += "</tr>";
- $(tr).insertAfter($lastTr);
- });
完整效果如下:
至此我们的需求才算结束。
总结
项目中渲染视图都是采用MVC中Razor渲染的方式,所以在做的时候也是跟着项目同样的风格去做,做的时候才发现这个问题并解决了下,学习,学习,可能还有其他解决方案,这也算是其中一种吧。
ASP.NET MVC之表单集合数据自动绑定到对象属性(集合)中的更多相关文章
- 返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, .net 4.5 带来的更方便的异步操作
原文:返璞归真 asp.net mvc (11) - asp.net mvc 4.0 新特性之自宿主 Web API, 在 WebForm 中提供 Web API, 通过 Web API 上传文件, ...
- Asp.net Mvc post表单提交多个实体模型
上一遍说道用Tuple实现Asp.net Mvc action返回多个模型实体给view,此篇发过来,实现view表单提交多个实体模型到action. 1.view代码: @{ Layout = nu ...
- ASP.NET MVC/Core表单提交后台模型二级属性验证问题
起因 这个是网友在官网论坛的提问:https://fineui.com/bbs/forum.php?mod=viewthread&tid=22237 重新问题 本着务实求真的态度,我们先来复现 ...
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
- 将Asp.Net MVC应用程序的控制器定义在单独的程序集(类库)中
一直以来都想把控制器的代码部署到单独的程序集里.昨天研究Asp.Net MVC的源代码,偶然发现有一个奇特的类“ControllerBuilder”,MSDN上的介绍相当简略,就一句话“表示一个类,该 ...
- 基于TeamCity的asp.net mvc/core,Vue 持续集成与自动部署
一 Web Server(Windows)端的配置 1.配置IIS,重要的是管理服务 1.1 配置FTP(前端NPM项目需要) 该步骤略,如果是在阿里云ESC上,需要开启端口21(用来FTP认证握手) ...
- ASP.NET MVC Form表单验证与Authorize特性
一.Form表单验证 1.基本概念 表单验证是一个基于票据(ticket-based)[也称为基于令牌(token-based)]的系统.当用户登录系统以后,会得到一个包含基于用户信息的票据(tick ...
- ASP.NET MVC多表单提交
多表单提交需要写清路径,以便主程序可以找到 方法一:直接写路径, action="~/Home/other1" "~"表示从根目录开始 方法2:@using ...
- ASP.NET MVC 获取表单数据
public class Person { public string Name{get;set;} public string Phone{get;set;} } view层 @model Mode ...
随机推荐
- 文本选择问题: css & js
CSS: /*Disable browser selection*/ .disableselect { -webkit-user-select: none; -moz-user-select: non ...
- weex append
append有两个值:其中的一个是tree, 另外一个是node. 不会像数据绑定一样对最后的渲染结果有影响.但它决定是否会影响整个节点的重绘还是只是某一个地方的内容会重绘. append=" ...
- http服务的安装与配置
挂载光盘mount /dev/cdrom /y #y是挂载光盘的位置 使用yum命令进安装httpd服务 yum命令的配置文件, yum配置文件位于 /etc/yun.repos.d 目录 ...
- asp.net 项目Net4.0 在IE10、 IE 11 下出现 “__doPostBack”未定义 的解决办法
我的项目中,服务器端是Windows Server2008 64位,.net版本是4.0,也遇到了树形结构控件.DropDownList控件等不能调用服务器端代码.最后发现js报错. 错误信息:“__ ...
- 编写base64图片文件
base64编码代替css背景图片在网站上应用是很广泛的,例如:loading gif图片,天猫加载时那只猫等等. 因为base64图片可以减少http请求,所以我们经常会把不经常改动的,独立的,尺寸 ...
- jsp页面 如何通过el表达式获取request属性值
1. 我在一个超连接后加个参数如: http://localhost:8080/test/testjstl.jsp?pid=001 此时在jsp页面中,获取jsp传过来的pid的参数值 ...
- [转]关于SVN的操作批处理示例
为了一句话:不要动手做机器能够做的事情. 天天工作用svn,更新啥的打开目录啥的动作天天在重复.每次写些命令也蛮无聊的,不说了,看下面: @echo off rem 显示部分 @echo 注 意 事 ...
- Javascript中call和apply的区别和用法
JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别.其实就是更改对象的内部指针,即改变对象的this指向的内容.这在面向对象的js编程过程中有时是很有用的.call ...
- windows上面捕获声卡数据
转自:http://shanewfx.github.io/blog/2013/08/14/caprure-audio-on-windows/ 前一段时间接到一个任务,需要采集到声卡的输出信号,以便与麦 ...
- EF 连接sql2000
正常连接会提示版本低 可以先用ef连接高版本的sql然后新建好EDMX文件后,在右键xml方式打开,把ProviderManifestToken="2008" 改为2000 然后再 ...