zoukankan      html  css  js  c++  java
  • 在Asp.Net MVC中使用ModelBinding构造Array、List、Collection以及Dictionary

    在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/

  • 相关阅读:
    blob 下载功能和预览功能
    实现大文件上传
    element ui框架之Upload
    常用utils
    vue实现excel表格上传解析与导出
    理解script加载
    js处理10万条数据
    Shadow DOM
    20150625_Andriod_01_ListView1_条目显示
    20150624_Andriod _web_service_匹配
  • 原文地址:https://www.cnblogs.com/zuowj/p/4092789.html
Copyright © 2011-2022 走看看