问题来源:

在和一位技术老师聊天时,老师问我一个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. 创建oracle 密码文件

    orapwd file='$ORACLE_HOME/dbs/oratest' password=oracle entries=5 force=y; 说明:●FILE参数指定口令文件存放的全路径及文件名 ...

  2. 常用文件操作 分类: C# 2014-10-14 16:18 108人阅读 评论(0) 收藏

    界面图: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...

  3. DELPHI 重命名文件名时 文件存在自动重命名

          procedure TForm1.Button1Click(Sender: TObject); var Dir, FileTitle, FileExt: string; s,s1: str ...

  4. [Reactive Programming] RxJS dynamic behavior

    This lesson helps you think in Reactive programming by explaining why it is a beneficial paradigm fo ...

  5. [React + webpack] hjs-webpack

    You can easily spend hours configuring the perfect dev environment with all the latest hotness like ...

  6. mapreduce实战:统计美国各个气象站30年来的平均气温项目分析

    气象数据集 我们要写一个气象数据挖掘的程序.气象数据是通过分布在美国各地区的很多气象传感器每隔一小时进行收集,这些数据是半结构化数据且是按照记录方式存储的,因此非常适合使用 MapReduce 程序来 ...

  7. Java语言基础(六)

    Java语言基础(六) 前一章提到的, BigDecimal, DecimalFormat等具体用法,这里就不在说了,网上有许多 一.下面让我们看一个例子(自由落体运动位移) 说明: (1).公式是 ...

  8. cogs 2507 零食店

    /* cogs 2507 零食店 跪了这题的数据了.... 第一遍Q*m 暴力询问 嗯 以为能的70 但只有40 Q已经到了1e6了 考试的时候 放弃了第三题又打了一遍 这次是Q*(n+logn) 最 ...

  9. css3 calc()

    概述 CSS函数calc()可以用在任何一个需要<length>的地方.有了calc(),你可以通过计算来决定一个对象的大小和形状. 你还可以在一个calc()内部嵌套另一个calc(). ...

  10. Looper Handler MessageQueue Message 探究

    Android消息处理的大致的原理如下: 1.有一个消息队列,可以往队列中添加消息 2.有一个消息循环,可以从消息队列中取出消息 Android系统中这些工作主要由Looper和Handler两个类来 ...