你的位置:首页 > ASP.net教程

[ASP.net教程]强类型视图中传入List 数据到控制器


问题来源:

在和一位技术老师聊天时,老师问我一个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)    {if(ent.Types!=null && ent.Types.Count>0)        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 < 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>    }        <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的底层原理,所以只能做以上推断,如有错误,还请指正。