强类型视图中传入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的底层原理,所以只能做以上推断,如有错误,还请指正。
时间: 2024-11-08 22:14:59

强类型视图中传入List 数据到控制器的相关文章

视图(View)与部分视图(Partial View)之间数据传递

写ASP.NET MVC程序,我们经常需要把数据从视图(View)传递至部分视图(Partial View) 或者相反. 今天Insus.NET使用 ControllerBase.TempData 进行处理. 首先演示的是View至Parital View创建一个控制器,并添加一个操作TmTestA(): 创建视图: 上图中标记#1,引用母版.标记#2,为TempData设置一个值.标记#3,使用Html.RenderPartial去Render一个部分视图. 创建部分视图,在部分视图中,去获取

ASP.NET MVC 5 - 将数据从控制器传递给视图

原文:ASP.NET MVC 5 - 将数据从控制器传递给视图 在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图.控制器类将响应请求来的URL.控制器类是给您写代码来处理传入请求的地方,并从数据库中检索数据,并最终决定什么类型的返回结果会发送回浏览器.视图模板可以被控制器用来产生格式化过的HTML从而返回给浏览器. 控制器负责给任何数据或者对象提供一个必需的视图模板,用这个视图模板来Render返回给浏览器的HTML.最佳做法是:一个视图模板应该永远不会执行业务逻辑或

[转]ASP.NET MVC 5 - 将数据从控制器传递给视图

在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图.控制器类将响应请求来的URL.控制器类是给您写代码来处理传入请求的地方,并从数据库中检索数据,并最终决定什么类型的返回结果会发送回浏览器.视图模板可以被控制器用来产生格式化过的HTML从而返回给浏览器. 控制器负责给任何数据或者对象提供一个必需的视图模板,用这个视图模板来Render返回给浏览器的HTML.最佳做法是:一个视图模板应该永远不会执行业务逻辑或者直接和数据库进行交互.相应的,一个视图模板应该只和控制器所提供

ASP.NET MVC搭建项目后台UI框架—8、将View中选择的数据行中的部分数据传入到Controller中

ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NET MVC搭建项目后台UI框架—4.tab多页签支持 ASP.NET MVC搭建项目后台UI框架—5.Demo演示Controller和View的交互 ASP.NET MVC搭建项目后台UI框架—6.客户管理(添加.修改.查询.分页) ASP.NET MVC搭建项目后台UI框架—7.统计报表 ASP.NE

ASP.NET MVC 表单提交多层子级实体集合数据到控制器中

于遇到了项目中实体类嵌套多层子级实体集合,并且子级实体集合的数据需要提交保存到数据库中的问题.针对此情况需要进行一些特殊的处理才可以将整个 实体类及子级实体集合数据提交表单到控制器中,解决的方法是根据MVC视图中表单的命名规则来设置正确的子级实体集合所属的表单控件name属性,从而来 获取提交的集合数据. 在说明如何将表单中实体的子级实体集合数据提交到控制器中的问题前,我们需要了解MVC的对于数组和列表集合的表单提交方式(点击此链接进行查看). 定义多层嵌套实体和假设场景 首先我们根据情况进行分

[asp.net mvc] 将视图中的表单数据传递到控制器中

在ASP.NET MVC框架中,将视图中的数据传递到控制器中,主要通过发送表单实现的.具体使用中,主要使用以下三种方法. 1.通过Request.Form读取表单数据 表单代码: 1 @using (Html.BeginForm("Person", "Default3")) 2 { 3 @Html.TextBox("tFirstName") 4 <br /> 5 @Html.TextBox("tLastName")

Yii2 HOW-TO(1):把数据从控制器传递到视图

控制器类中定义数据 public function actionIndex() { $h1 = '这是一个主标题!'; $h4 = '这是一个副标题'; $dateTime = new \DateTime(); return $this->render('index', ['title' => $h1, 'subTitle' => $h4,'dateTime'=>$dateTime]); } 视图中使用数据 <?php use yii\helpers\Html; $this-

在ASP.NET MVC控制器中获取链接中的路由数据

在ASP.NET MVC中,在链接中附加路由数据有2种方式.一种是把路由数据放在匿名对象中传递: <a href="@Url.Action("GetRouteData","Home",new { ReturnUrl = Request.Url.PathAndQuery, x = 10})">走你</a> 一种是放在RouteValueDictionary对象中传递: <a href="@Url.Action

视图之二--视图中数据的更新

视图不是表,视图里面的数据是通过sql语句去表中查询得到的.当表中的数据发送更改之后,视图里的数据也会发生相应的更改.所以我么一般有两种方式更新视图里面的数据:一是更新表中的数据,从而间接地更新视图中的数据:二是直接写sql已经更新视图.第一种是方式是一定可以的,第二中方法,能否可行取决于视图的具体结构.以下对第二种方法进行分析. 表结构如下: 1 -- ---------------------------- 2 -- 学生表 3 -- ----------------------------