问题来源:

在和一位技术老师聊天时,老师问我一个mvc 表单提交的问题,问道:怎样在表单提交的时候,将 带有 List 属性的对象传入控制器?

这时,我有点呆了,以前一直都好像是 单一属性的表单提交,没有做过 带有list属性 的表单提交。最后饶了一圈,还是老老实实回答老师,不知道,没有处理过。

既然问题出来了,并且还不会,这肯定是不可以的,回去后,开始模拟场景,测试解决问题:

1. 首先准备两个实体类

   public class Article
    {
        public string Title { get; set; }

        public string Content { get; set; }

        public List<ArticleType> Types { get; set; }
    }

   public class ArticleType
    {
        public string Name { get; set; }
        public string Dirc { get; set; }

    }

2.控制器 和 对应视图

 public class TestController : Controller
    {
        //
        // GET: /Test/
        public ActionResult Index()
        {
             ViewBag.Mes = "准备测试";return View();
        }

        [HttpPost]
        public ActionResult Index(Article ent)
        {)
               ViewBag.Mes = "Article下的Types个数为:" + ent.Types.Count;return View();
        }
    }
@model TestUI.Models.Article
@{
    ViewBag.Title = "Index";
}

<div style="padding:20px">
    @ViewBag.Mes
    <form action="index" method="post">
        <p>
            <span>标题:</span>
            @Html.TextBoxFor(x => x.Title)
        </p>
        <p>
            <span>内容:</span>
            @Html.TextAreaFor(x => x.Content)
        </p>

        @for (var i = 0; i ; i++)
        {
             <p>
                 <span>类型@(i):</span><br>
                 <span>名称:</span>
                 @Html.TextBoxFor(x => x.Types[i].Name)
                 <span>描述:</span>
                 @Html.TextBoxFor(x => x.Types[i].Dirc)
            </p>
        }

        <p>
            <button type="submit">提交</button>
        </p>
    </form>
</div>

3. 结果运行图

没提交前

提交后

结果已经很明确了,这是一种解决方案,经测试post和get提交都有效。

推断能成功的原因:

还是得归功于mvc的强类型视图的解析机制。

表单提交的本质是 表单标签的name 作为 参数名称,表单标签的value 作为 参数值。

@for (var i = 0; i < 2; i++)
{
    <p>
       <span>类型@(i):</span><br>
       <span>名称:</span>
       @Html.TextBoxFor(x => x.Types[i].Name)
       <span>描述:</span>
       @Html.TextBoxFor(x => x.Types[i].Dirc)
    </p>
 }

mvc中只有 Types 为 list 时,才能允许你这样写 x.Types[i].Name ,由于mvc语法约定在先,所以当你提交表单时,参数解析器(自己的叫法)会 把 x.Types[i] 的数据值整理添加到 List 中。

由于没有研究过mvc的底层原理,所以只能做以上推断,如有错误,还请指正。

asp.net mvc 强类型视图中传入List 数据到控制器的更多相关文章

  1. 如何在FineUIMvc(ASP.NET MVC)视图中绑定多个模型?

    起因 这是知识星球内的一个网友提出的,按理说ASP.NET MVC中一个视图只能绑定一个模型(Model),在视图顶部标识如下: @model IEnumerable<FineUICore.Ex ...

  2. asp.net mvc 在视图中获取控制器与动作的名称

    获取 controller 名称: ViewContext.RouteData.Values["controller"].ToString(); 获取 action 名称: Vie ...

  3. ASP.NET MVC 5 - 视图

    在本节中,你要去修改HelloWorldController类,使用视图模板文件,在干净利索地封装的过程中:客户端浏览器生成HTML. 您将创建一个视图模板文件,其中使用了ASP.NET MVC 3所 ...

  4. ASP.NET MVC Razor视图引擎攻略

    --引子 看下面一段MVC 2.0的代码. <%if (Model != null){%> <p><%=Model%></p><%}%>&l ...

  5. 在ASP.NET MVC应用程序中实现Server.Transfer()类似的功能

    在ASP.NET MVC应用程序中,如果使用Server.Transfer()方法希望将请求转发到其它路径或者Http处理程序进行处理,都会引发“为xxx执行子请求时出错”的HttpException ...

  6. ASP.NET MVC 3: Razor中的@:和语法

    原文 ASP.NET MVC 3: Razor中的@:和语法 [原文发表地址] ASP.NET MVC 3: Razor’s @: and <text> syntax[原文发表时间] De ...

  7. ASP.NET MVC开发学习过程中遇到的细节问题以及注意事项

    1.datagrid中JS函数传值问题: columns: { field: 'TypeName', title: '分类名称', width: 120, sortable: true, format ...

  8. 7.ASP.NET MVC 5.0中的Routing【路由】

    大家好,这一篇向大家介绍ASP.NET MVC路由机制.[PS:上一篇-->6. ASP.NET MVC 5.0中的HTML Helpers[HTML帮助类] ] 路由是一个模式匹配系统,它确保 ...

  9. ASP.NET 4(和ASP.NET MVC 2)中输出HTML编码的新语法<%:%>

    今天的文章介绍了ASP.NET 4中引入的一个小而且非常有用的新语法功能 - 这是在代码块中自动对输出进行HTML编码的功能.这有助于保护您的应用程序和站点免受跨站点脚本注入(XSS)和HTML注入攻 ...

随机推荐

  1. IE的Cookie目录和临时缓存目录的关系

    1.IE的Cookie位置注册表设置: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folde ...

  2. 微信公众平台--网页授权获取用户基本信息(snsapi_base方式)

    关于snsapi_base网页授权的说明 以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的.用户感知的就是直接进入了回调 ...

  3. css三角形绘制

    三角形演变: 1.将一个块元素的宽.高都设置为0,再设置边框样式,得如下效果图(绿色部分): 样式: {;;border: 35px solid #7de87d;} 通过此样式得到的是一个正方形. 2 ...

  4. 用的最多的Android Studio 快捷键

    1.Ctrl+D,Ctrl+C 复制删除整一行 2.Ctrl+Alt+L 格式化代码 看起来更好看 3.Ctrl+Q 查看函数API定义 4.Atl+方向键 切换不同文档 平时用快捷键能够提高效率,少 ...

  5. gitlab 启动参考

    第一步 启动gitlab bundle exec rails s -e production -d 第二步 启动redis /etc/init.d/redis start chkconfig redi ...

  6. iOS 百度地图 小的特点demo

    先上图的样子 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDEyMzIwOA==/font/5a6L5L2T/fontsize/400/fill ...

  7. ProGuard详解

    综述 对于ProGuard工具想必我们都不陌生,它能够通过移除无用代码,使用简短无意义的名称来重命名类,字段和方法.从而能够达到压缩.优化和混淆代码的目的.最终我们会获取一个较小的apk文件,并且我们 ...

  8. Markdown写接口文档,自动添加TOC

    上回说到,用Impress.js代替PPT来做项目展示.这回换Markdown来做接口文档好了.(不敢说代替Word,只能说个人感觉更为方便)当然,还要辅之以Git,来方便版本管理. Markdown ...

  9. Objective-C:KVC

    1 概述 1.1 访问方法 Key-value coding(KVC)是一种间接访问对象属性的机制,类似键值对,通过名字(或键)可以直接获得对象的属性值.事实上,key-value coding定义了 ...

  10. SQL Server Management Studio 使用作业实现数据库备份

    1.数数据库备份脚本: 数据库备份:DECLARE @BcpFile VARCHAR(30),@SQLBACKUP VARCHAR(1000),@BcpFullFile VARCHAR(100) SE ...