在Asp.Net MVC中使用ModelBinding构造Array、List、Collection以及Dictionary

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介:

在asp.net mvc中,我们可以在html表单中使用特定的格式传递参数,从而通过model binder构造一些集合类型。

第一种方式

比如这样一个方法

public ActionResult Infancy(Person[] people)
{
    // ...  
} 

并在表单中添加这些input元素

<input type="text" name="people[0].FirstName" value="神" />
<input type="text" name="people[0].LastName" value="鱼" />
<input type="text" name="people[1].FirstName" value="郁闷的" />
<input type="text" name="people[1].LastName" value="PP" />
<input type="text" name="people[3].FirstName" value="重" />
<input type="text" name="people[3].LastName" value="典" />

当其作为一个HTTP POST被提交后的数据大概是这个样子

people%5B0%5D.FirstName=神&people%5B0%5D.LastName=鱼&people%5B1%5D.FirstName=郁闷的&people%5B1%5D.LastName=PP&people%5B3%5D.FirstName=重&people%5B3%5D.LastName=典

那么通过model binder我们将得到这样的一个Array集合

people[0].FirstName = "神"  
people[0].LastName = "鱼"  
people[1].FirstName = "郁闷的"  
people[1].LastName = "PP"  
people[3].FirstName = "重"  
people[3].LastName = "典" 

这样就和我们在代码中显式的构建如下集合是一样的

people = new Person[] {  
new Person() { FirstName = "神", LastName = "鱼" },  
new Person() { FirstName = "郁闷的", LastName = "PP" } 

这里会按照parameterName[index].PropertyName的规则来解析属性。其中,索引必须是连续的且以0开始的正整数。在上面的例子中由于没有people[2],所以”重典”将不会被解析。

第二种方式

我们再来看下一种情况

方法签名如下

public ActionResult Infancy(IDictionary<string, Information> people)
{
    // ...  
} 

Html这样构造

<input type="text" name="people[0].Key" value="forever" />
<input type="text" name="people[0].Value.Age" value="12" />
<input type="text" name="people[0].Value.Gender" value="纯爷们" />
<input type="text" name="people[1].Key" value="郁闷的PP" />
<input type="text" name="people[1].Value.Age" value="50" />
<input type="text" name="people[1].Value.Gender" value="不好说" />

我们将会得到这样的键值集合

people[0].Key = "forever"  
people[0].Value.Age = 12  
people[0].Value.Gender = "纯爷们"  
people[1].Key = "郁闷的PP"  
people[1].Value.Age = 50
people[1].Value.Gender = "不好说" 

如同我们在代码中这样构造

var people = new Dictionary<string, Information>() {  
  { "forever", new Information() { Age = 12, Gender = "纯爷们" } },  
  { "郁闷的PP", new Information() { Age = 50, Gender = "不好说" } }  
};

这里解析key的方式是寻找parameterName[index].Key这样的结构、解析value的方式是寻找parameterName[index].Value这样的结构。如果key或者value是复杂类型(如上面例子中的Information类型),则parameterName[index].KeyparameterName[index].value将被视为前缀(也可以理解为某个类型)而.PropertyName被视为后缀(即某个属性)。这里的索引也要求必须是以0开始的不间断的正整数。否则断开以后的部分将不会被解析。

构建IEnumerable<T>, ICollection<T>, IList<T>, T[], Collection<T>, 以及 List<T>这类集合类型需要使用第一种语法。
而构建IDictionary<TKey, TValue> 和 Dictionary<TKey, TValue>这类集合需要使用第二种语法。

如果你不喜欢这种方式,你完全可以在Asp.net mvc中自定义一些binder来处理特定的类型。或者直接使用FormCollection

参考资料:

http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

http://www.hanselman.com/blog/ASPNETWireFormatForModelBindingToArraysListsCollectionsDictionaries.aspx










本文转自紫色永恒51CTO博客,原文链接:http://www.cnblogs.com/024hi/archive/2009/02/20/1394517.html ,如需转载请自行联系原作者

相关文章
|
2月前
|
算法
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
32 5
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
37 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
52 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
44 0
|
3月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
3月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
118 0
|
4月前
|
存储 安全 编译器
Python学习日记(一:List、Tuple、dictionary)
1.列表、元组和字典都是序列 2.列表字典可以修改和删除序列中的某个元素,而元组就是一个整体,不能修改和删除,一定要修改或删除的话,只能修改和删除整个元组。 3.既然元组不能删除和修改,有什么作用呢? 1.元组比列表遍历速度快,因为元组是一个整体,运算效率高; 2.正是因为不能修改,元组可以保护不需要修改的数据,可以使代码结构更安全。
|
6月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
75 0
|
6月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
321 5
|
6月前
|
存储 Java API
java集合Collection(List)和泛型
java集合Collection(List)和泛型