在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在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].Key或parameterName[index].value将被视为前缀(也可以理解为某个类型)而.PropertyName被视为后缀(即某个属性)。这里的索引也要求必须是以0开始的不间断的正整数。否则断开以后的部分将不会被解析。 构建IEnumerable<T>, ICollection<T>, IList<T>, T[], Collection<T>, 以及 List<T>这类集合类型需要使用第一种语法。 如果你不喜欢这种方式,你完全可以在Asp.net mvc中自定义一些binder来处理特定的类型。或者直接使用FormCollection。 参考资料: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx |
请发表评论