1,属性为引用类型(非集合,非数组)

//模型1
public class Contact
{
public string Name { get; set; }
public string PhoneNo { get; set; }
public string EmailAddress { get; set; }
public Address MyAddress { get; set; }
}
public class Address
{
public string Province { get; set; }
public string City { get; set; }
public string District { get; set; }
public string Street { get; set; }
}
//请求表单范例,name属性,具有显著的层次结构,注意子属性前缀用的是属性名MyAddress
<input name="Name" type="text" ... />
<input name="PhoneNo" type="text" ... />
<input name="EmailAddress" type="text" ... />
<input name="MyAddress.Province" type="text" ... />
<input name="MyAddress.City" type="text" ... />
<input name="MyAddress.District" type="text" ... />
<input name="MyAddress.Street" type="text"... />
public ActionResult Action(Contact foo){}

2,基于名称的简单类型数组绑定(名称必须相同)

//数据源范例
<input name="Foo" type="text" value=""/>
<input name="Foo" type="text" value="" />
<input name="Foo" type="text" value="" />
Public ActionResult ActionMethod(string[] foo){}//action的参数名“foo”,必须与表单中的name的值匹配

3,基于索引的对象数组绑定(索引必须从0开始,且连续,不连续会导致后面的绑定丢失)

//请求表单范例
<input name="[0].Name" type="text" value="" .../>
<input name="[0].PhoneNo" type="text" ... />
<input name="[0].EmailAddress" type="text" ... />
<input name="[1].Name" type="text" value="" .../>
<input name="[1].PhoneNo" type="text" ... />
<input name="[1].EmailAddress" type="text" ... />
 public ActionResult Index(Contact[] contacts){}

4,集合(除数组和字典之外的所有实现IEnumerable<T>接口的类型)

//请求表单范例
<input name="[0].Name" type="text" value="" .../>
<input name="[0].PhoneNo" type="text" value="" .../>
<input name="[0].EmailAddress" type="text" value="" .../> <input name="[1].Name" type="text" value="" .../>
<input name="[1].PhoneNo" type="text" value="" .../>
<input name="[1].EmailAddress" type="text" value="" .../>
//集合范例
public ActionResult Action(IEnumerable<Contact> contacts){
foreach (var contact in contacts){}
}

5,字典(实现了接口IDictionary<TKey,TValue>的类型)

//请求表单范例,注意Key的值不能重复,且索引要连续
<input name="[0].Key" type="text" value="Foo" .../>
<input name="[0].Value.Name" type="text" value="" .../>
<input name="[0].Value.PhoneNo" type="text" value="" .../>
<input name="[0].Value.EmailAddress" type="text" value="a@z.com" .../> <input name="[1].Key" type="text" value="Bar" .../>
<input name="[1].Value.Name" type="text" value="Bar" .../>
<input name="[1].Value.PhoneNo" type="text" value="" .../>
<input name="[1].Value.EmailAddress" type="text" value="b@z.com" .../>
public ActionResult Action(IDictionary<string, Contact> contacts)
{
foreach (string key in contacts.Keys)
{
Contact contact = contacts[key];
}
}

6,混合应用,属性是数组

public class QuizAnswer
{
public int QuizId { get; set; }
public string[] QuizAnswerArray { get; set; }//答案为数组 }
<!--第一题,单选-->
<input name="[0].QuizId" type="hidden" value="" />
<input name="[0].QuizAnswerArray" type="radiobox" value="A" />
<input name="[0].QuizAnswerArray" type="radiobox" value="B" />
<input name="[0].QuizAnswerArray" type="radiobox" value="C" />
<input name="[0].QuizAnswerArray" type="radiobox" value="D" /> <!--第二题,多选-->
<input name="[1].QuizId" type="hidden" value="" />
<input name="[1].QuizAnswerArray" type="checkbox" value="A" />
<input name="[1].QuizAnswerArray" type="checkbox" value="B" />
<input name="[1].QuizAnswerArray" type="checkbox" value="C" />
<input name="[1].QuizAnswerArray" type="checkbox" value="D" />
//控制器代码
public ActionResult SubmitAnswer(QuizAnswer[] answerArray)
{
foreach (var answer in answerArray)
{
}
}

7,混合应用,属性是集合

模型:属性是集合的情况

//公司
public class Company
{
public string Name { get; set; }
public string City { get; set; }
public IList<Job> JobList{ get; set; }//这里是个集合
}
//职位
public class Job
{
public string Title{ get; set; }
public string Detail{ get; set; }
}
//注意集合的前缀为List
<input name="Name" type="text" ... />
<input name="City" type="text" ... /> <input name="JobList[0].Title" type="text" ... />
<input name="JobList[0].Detail" type="text" ... /> <input name="JobList[1].Title" type="text" ... />
<input name="JobList[1].Detail" type="text" ... /> <input name="JobList[2].Title" type="text" ... />
<input name="JobList[2].Detail" type="text" ... />
//controller
Public ActionResult ActionMethod(Company company)
{
foreach(var job in company.JobList){}
}

参考http://www.cnblogs.com/artech/archive/2012/05/30/default-model-binding-02.html

MVC复杂类型的模型绑定的更多相关文章

  1. ASP.NET MVC Model之二模型绑定

    Asp.net mvc中的模型绑定,或许大家经常用,但是具体说他是怎么一回事,可能还是会有些陌生,那么,本文就带你理解模型绑定.为了理解模型绑定,本文会先给出其定义,然后对通过比,来得出使用模型绑定的 ...

  2. ASP.NET Core MVC/WebAPi 模型绑定探索

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  3. ASP.NET Core 中文文档 第四章 MVC(2.1)模型绑定

    原文:Model Binding 作者:Rachel Appel 翻译:娄宇(Lyrics) 校对:许登洋(Seay).何镇汐 模型绑定介绍 ASP.NET Core MVC 中的模型绑定从 HTTP ...

  4. 白话学习MVC(六)模型绑定

    一.什么是模型绑定? 模型绑定存在的意义就是为Action的参数提供值,例如:如下表单中提交了数据,那么Action(即:Index)的参数Id,Name的值就是表单中对应的name属性相同的值,而表 ...

  5. ASP.NET MVC学习之模型绑定(2)

    3.手工调用模型绑定 很多情况下我们都是通过形参的方式接收来自http流中的数据,这看似是完美的,但是缺少了很多过程中的控制,所以我们就需要使用手工的方式进行绑定.下面我们通过一个例子来说明,首先打开 ...

  6. .NET MVC学习之模型绑定

    ASP.NET MVC学习之模型绑定(2)   继ASP.NET MVC学习之模型绑定继续 3.手工调用模型绑定 很多情况下我们都是通过形参的方式接收来自http流中的数据,这看似是完美的,但是缺少了 ...

  7. ASP.NET Core MVC 模型绑定用法及原理

    前言 查询了一下关于 MVC 中的模型绑定,大部分都是关于如何使用的,以及模型绑定过程中的一些用法和概念,很少有关于模型绑定的内部机制实现的文章,本文就来讲解一下在 ASP.NET Core MVC ...

  8. ASP.NET没有魔法——ASP.NET MVC 模型绑定

    在My Blog中已经有了文章管理功能,可以发布和修改文章,但是对于文章内容来说,这里缺少最重要的排版功能,如果没有排版的博客很大程度上是无法阅读的,由于文章是通过浏览器查看的,所以文章的排版其实与网 ...

  9. ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(下篇)

    上一篇<ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)>文章介绍了ASP.NET MVC模型绑定的相关组件和概念,本章将介绍Controller在执行时是如何通过这 ...

随机推荐

  1. Free Online SQL Formatter

    SQL Formatter Web Service Free Online SQL Formatter SQL Parser engine used by SQL formatter 今日找了几个在线 ...

  2. Log4j日志配置说明

    一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...

  3. 苹果手机 iTunes 资料备份到另一手机

    百度教程 https://jingyan.baidu.com/article/d621e8da332e602865913f8e.html 直接使用iTunes将老手机的资料备份, (可能需要关闭手机定 ...

  4. 中间件——Oracle Fusion Middleware

    Oracle Fusion Middleware定义: 什么是Oracle Fusion Middleware Oracle Fusion Middleware is a comprehensive ...

  5. selenium新的定位方法,更简洁很方便

    亲测是可以的 self.driver.find_element('id','kw').send_keys(u"凯宾斯基")

  6. easyui-combotree 只能选叶子未级

    easyui-combotree 只能选叶子未级 function edit_dg() { //选中一行,获取这一行的属性的值 var selected = $('#tbClientListBrows ...

  7. 如何判断PHP数组是否为空

    PHP判断数组为空首选方法:count($arr),size($arr); $arr=array("");echocount($arr);echo size($arr); //输出 ...

  8. 【转载】解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的方法

    1.开启Ad Hoc Distributed Queries组件,在sql查询编辑器中执行如下语句: exec sp_configure 'show advanced options',1 recon ...

  9. 小白之js原生轮播图

    html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  10. ffmpeg个人翻译文档1-8<转>

    [个人翻译]ffmpeg文档1 (2008-08-26 09:39:15) 转载 标签: 杂谈 分类: 翻译文档 指导1:制作屏幕录像 源代码:tutorial01.c 概要   电影文件有很多基本的 ...