问题来源:

在和一位技术老师聊天时,老师问我一个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. JVM分代垃圾回收策略的基础概念

    由于不同对象的生命周期不一样,因此在JVM的垃圾回收策略中有分代这一策略.本文介绍了分代策略的目标,如何分代,以及垃圾回收的触发因素. 文章总结了JVM垃圾回收策略为什么要分代,如何分代,以及垃圾回收 ...

  2. 364. Nested List Weight Sum II

    这个题做了一个多小时,好傻逼. 显而易见计算的话必须知道当前层是第几层,因为要乘权重,想要知道是第几层又必须知道最高是几层.. 用了好久是因为想ONE PASS,尝试过遍历的时候构建STACK,通过和 ...

  3. mysql创建数据库(指定编码)

    如下脚本创建数据库yourdbname,并制定默认的字符集是utf8. CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 CO ...

  4. Android 判断数据库中是否存在某个表

    public boolean tabIsExist(String tabName){ boolean result = false; if(tabName == null){ return false ...

  5. hadoop的wordcount的改动版

    //这个是在原来的基础上改动以后得到的,将当中的分词的根据给换掉了,而且进行词频统计的时候会自己主动的忽略大写和小写 packageorg.apache.hadoop.mapred; importja ...

  6. 进程的优先级 与 CFS 进程调度

    在Linux下改变进程的优先级 作者:曾老师,华清远见嵌入式学院讲师. 作为多任务的操作系统,Linux内核为每个创建的进程分配时间片并根据其优先级进行调度.当进程被创建时,其对应的task_stru ...

  7. poj1066

    很好的一道题.题意是,一个正方形围墙内有一些交错的内墙,内墙的端点都在正方形上,在正方形内部有一个点,求从正方形外到这个点的最少要走的门数,门只能是线段的中点. 思路很巧妙,因为从一个点到终点不可能“ ...

  8. 第五篇:python基础之循环结构以及列表

    python基础之循环结构以及列表   python基础之编译器选择,循环结构,列表 本节内容 python IDE的选择 字符串的格式化输出 数据类型 循环结构 列表 简单购物车的编写 1.pyth ...

  9. Couchbase用的端口

    文档首页: http://www.couchbase.com/documentation http://docs.couchbase.com/couchbase-manual-2.2/#prepara ...

  10. angularJS function

    angular.bootstrap 启动Angular angular.element 相当于轻量的JQuery 使用方法: angular.element('#qq'); angular.eleme ...