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

第一种方式

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

Html表单构造

<input name="people[0].FirstName" type="text" value="神" />
<input name="people[0].LastName" type="text" value="鱼" />
<input name="people[1].FirstName" type="text" value="郁闷的" />
<input name="people[1].LastName" type="text" value="PP" />
<input name="people[3].FirstName" type="text" value="重" />
<input name="people[3].LastName" type="text" 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我们将得到这样的一个people变量的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="不好说" />

那么通过model binder我们将得到这样的一个people键值集合:

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].Key或parameterName[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。

更多IT相关的文章,欢迎光临我的个人网站:http://www.zuowenjun.cn/

在Asp.Net MVC中使用ModelBinding构造Array、List、Collection以及Dictionary的更多相关文章

  1. ASP.NET MVC中使用ASP.NET AJAX异步访问WebService

    使用过ASP.NET AJAX的朋友都知道,怎么通过ASP.NET AJAX在客户端访问WebService,其实在ASP.NET MVC中使用ASP.NET AJAX异步访问WebService 也 ...

  2. [转]ASP.NET MVC中你必须知道的13个扩展点

    本文转自:http://www.cnblogs.com/ejiyuan/archive/2010/03/09/1681442.html ScottGu在其最新的博文中推荐了Simone Chiaret ...

  3. 在ASP.NET MVC中使用IIS级别的URL Rewrite

    原文 在ASP.NET MVC中使用IIS级别的URL Rewrite 大约一年半前,我在博客上写过一系列关于URL Rewrite的文章(2.3.4),把ASP.NET平台上进行URL Rewrit ...

  4. Asp.net mvc 中Action 方法的执行(二)

    [toc] 前面介绍了 Action 执行过程中的几个基本的组件,这里介绍 Action 方法的参数绑定. 数据来源 为 Action 方法提供参数绑定的原始数据来源于当前的 Http 请求,可能包含 ...

  5. ASP.NET MVC中设置跨域

    ASP.NET MVC中设置跨域 1.什么是跨域请求 js禁止向不是当前域名的网站发起一次ajax请求,即使成功respone了数据,但是你的js仍然会报错.这是JS的同源策略限制,JS控制的并不是我 ...

  6. ASP.NET MVC中你必须知道的13个扩展点

         ScottGu在其最新的博文中推荐了Simone Chiaretta的文章13 ASP.NET MVC extensibility points you have to know,该文章为我 ...

  7. [Asp.net mvc]Asp.net mvc 中使用LocalStorage

    目前使用比较多的本地存储方案有比如Flash SharedObject.Google Gears.Cookie.LocalStorage.User Data.Open Database等方案.综合比较 ...

  8. C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例

    C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...

  9. ASP.NET MVC中controller和view相互传值的方式

    ASP.NET MVC中Controller向view传值的方式: ViewBag.ViewData.TempData 单个值的传递 Json 匿名类型 ExpandoObject Cookie Vi ...

随机推荐

  1. Tomcat 安全配置与性能优化

    一.Tomcat内存优化 1.JAVA_OPTS参数说明 Tomcat内存优化主要是对 tomcat 启动参数优化,我们可以在 tomcat 的启动脚本 catalina.sh 中设置 JAVA_OP ...

  2. Apache Error: Invalid command ‘Allow’, perhaps misspelled or defined by a module not included in the server configuration

    在一个Window Server 2008R2系统上使用Apache架设了一个PHP的网站项目 在配置Apache的过程中出现了以下问题   根据上面的提示说是没有相应的权限,那就在虚拟主机里进行了配 ...

  3. C# HttpWebRequest 绝技 根据URL地址获取网页信息

    如果要使用中间的方法的话,可以访问我的帮助类完全免费开源:C# HttpHelper,帮助类,真正的Httprequest请求时无视编码,无视证书,无视Cookie,网页抓取 1.第一招,根据URL地 ...

  4. EF 5.0 帮助类

    EF 5.0 帮助类 加入命名空间: using System; using System.Data; using System.Data.Entity; using System.Data.Enti ...

  5. 804 pretest 解题

    Answers with Explanations 1. c) s1 and s2 not equal s1 and s3 equal JVM sets a constant pool in whic ...

  6. 一致性哈希算法 - consistent hashing

    1 基本场景比如你有 N 个 cache 服务器(后面简称 cache ),那么如何将一个对象 object 映射到 N 个 cache 上呢,你很可能会采用类似下面的通用方法计算 object 的 ...

  7. typeof instanceof 之间的区别总结

        typeof   它返回值是一个字符串,该字符串说明运算数的类型. a=1; b=true; c="c"; d=function(){ console.log(" ...

  8. Windows CMD命令大全(转)

    Windows CMD命令大全   命令简介 cmd是command的缩写.即命令行 . 虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行 ...

  9. 如何将 Cortana 与 Windows Phone 8.1 应用集成 ( Voice command - Natural language recognition )

    随着 Windows Phone 8.1 GDR1 + Cortana 中文版的发布,相信有很多用户或开发者都在调戏 Windows Phone 的语音私人助理 Cortana 吧,在世界杯的时候我亲 ...

  10. Android下海康实时视频解码

    折腾了一个多月,终于调出来了.....首先吐槽一下海康SDK,同时也感谢之... 手头有个项目,需要实时抓取海康摄像头,我是在Android下实现的,海康官网上没有Android SDK,这里友情提醒 ...