[置顶] ASP.NET MVC - Model Binding
Http Request 到Input Model的绑定按照model的类型可分为四种情况。
- Primitive type
- Collection of primitive type
- Complex type
- Collection of complex type
首先理解Value Privider and Precedence
Model Binder是利用Value Provider来获取相关数据的。
1. Primitive type
Controller Method:
public class BindingController : Controller
{
public ActionResult Repeat(String text, Int32 number)
{
var model = new RepeatViewModel {Number = number, Text = text};
return View(model);
}
}
Http Request : 采用Query String 方式
http://server/binding/repeat?text=Dino&number=2
2. Complex type
Complex Type:
public class RepeatText
{
public String Text { get; set; }
public Int32 Number { get; set; }
}
Controller Method:
public class ComplexController : Controller
{
public ActionResult Repeat(RepeatText inputModel)
{
var model = new RepeatViewModel
{
Title = "Repeating text",
Text = inputModel.Text,
Number = inputModel.Number
};
return View(model);
}
}
Http Request : 采用Query String 方式
http://server/binding/repeat?text=Dino&number=2
Model Binder 将从posted data中寻找Key name与Property Name匹配的。从而可以实例化RepeatText对象。
3. Collection of primitive type
Form :
@using (Html.BeginForm())
{
<h2>List your email address(es)</h2>
foreach(var email in Model.Emails)
{
<input type="text" name="emails" value="@email" />
<br />
}
<input type="submit" value="Send" />
}
Controller Method:
public ActionResult Emails(IList<String> emails)
{
...
}
In the end, to ensure that a collection of values is passed to a controller method, you need to
ensure that elements with the same ID are emitted to the response stream.
4. Collection of complex type
Complex Type:
public class Country
{
public Country()
{
Details = new CountryInfo();
}
public String Name { get; set; }
public CountryInfo Details { get; set; }
}
public class CountryInfo
{
public String Capital { get; set; }
public String Continent { get; set; }
}
Controller Method:
[ActionName("Countries")]
[HttpPost]
public ActionResult ListCountriesForPost(IList<Country> countries)
{
...
}
Form:
@using (Html.BeginForm())
{
<h2>Select your favorite countries</h2>
var index = 0;
foreach (var country in Model.CountryList)
{
<fieldset>
<div>
<b>Name</b><br />
<input type="text"
name="countries[@index].Name"
value="@country.Name" /><br />
<b>Capital</b><br />
<input type="text"
name="countries[@index].Details.Capital"
value="@country.Details.Capital" /><br />
<b>Continent</b><br />
@{
var id = String.Format("countries[{0}].Details.Continent", index++);
}
@Html.TextBox(id, country.Details.Continent)
<br />
</div>
</fieldset>
}
<input type="submit" value="Send" />
}
总结:
如果default model binder不能适应需求则需要开发custom model binder。例如用三个TextBox实现一个DateHelper。
[置顶] ASP.NET MVC - Model Binding的更多相关文章
- [ASP.NET MVC] Model Binding With NameValueCollectionValueProvider
[ASP.NET MVC] Model Binding With NameValueCollectionValueProvider 范例下载 范例程序代码:点此下载 问题情景 一般Web网站,都是以H ...
- ASP.NET MVC Model验证(五)
ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...
- ASP.NET MVC Model验证(四)
ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...
- ASP.NET MVC Model验证(三)
ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的M ...
- ASP.NET MVC Model验证(二)
ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...
- ASP.NET MVC Model验证(一)
ASP.NET MVC Model验证(一) 前言 前面对于Model绑定部分作了大概的介绍,从这章开始就进入Model验证部分了,这个实际上是一个系列的Model的绑定往往都是伴随着验证的.也会在后 ...
- ASP.NET MVC Model绑定(六)
ASP.NET MVC Model绑定(六) 前言 前面的篇幅对于IValueProvider的使用做个基础的示例讲解,但是没并没有对 IValueProvider类型的实现做详细的介绍,然而MVC框 ...
- ASP.NET MVC Model绑定(五)
ASP.NET MVC Model绑定(五) 前言 前面的篇幅对于IValueProvider的获取位置和所处的生成过程做了讲解,本篇将会对IValueProvider的使用做个基础的示例讲解,读完本 ...
- ASP.NET MVC Model绑定(四)
ASP.NET MVC Model绑定(四) 前言 前面的篇幅对于Model绑定器IModelBinder以及实现类型.Model绑定器提供程序都作了粗略的讲解,可以把Model绑定器想象成一个大的容 ...
随机推荐
- VmWare下安装Linux Centos6.0详细过程
http://www.linuxidc.com/Linux/2012-12/76583.htm和http://mirrors.163.com/centos/6.5/isos/i386/这是有关VmWa ...
- SQL合并时间段的问题
假设表结构如下所示: Tsheets 字段名 字段类型 约束 id CHAR(10) PRIMARY KEY start_date DATE CHECK(start_date<= end_dat ...
- htmlcss笔记--标签默认值样式重置css reset(2)
1.内联,内嵌,行内元素: 默认可以继续跟同类型标签显示: 由内容撑开宽度,内容多宽,会有多宽: span,内嵌标签部支持宽高,即使加了宽高也不支持, 也不支持上下内外边距,但是支持左右内外边距:内上 ...
- mybatis系列-10-一对一查询
10.1 需求 查询订单信息,关联查询创建订单的用户信息 10.2 resultType 10.2.1 sql语句 确定查询的主表:订单表 确定查询的关联表:用户表 关联查询 ...
- Buffer -nodejs
纯 JavaScript 对 Unicode 友好但是无法很好地处理二进制数据.当我们面对类似 TCP 流或文件系统时,是需要处理八位流的.Node 有几种操作.创建以及消费八位流的策略.原始数据保存 ...
- hive常见问题解决干货大全
本人,苦心多时,历经磨难和心血,与大家共同攻克问题难关! 问题一: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive ...
- 【转】Xcode 插件优缺点对比(推荐 20 款插件)
[转自]http://www.cnblogs.com/dsxniubility/p/5099191.html 1.Alcatraz 类似于管理第三方库的cocoapods,管理插件也有个Alcatra ...
- PC问题-VMware Workstation出现“文件锁定失败”
问题现象:电脑关机时挂起VMware Workstation后,第二天运行VMware Workstation出现“文件锁定失败”. 问题原因:在WIN的目录中有*.LCK文件,此文件是用来锁定当前虚 ...
- POJ 1789 Truck History (最小生成树)
Truck History 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/E Description Advanced Carg ...
- HDU 5726 GCD (RMQ + 二分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5726 给你n个数,q个询问,每个询问问你有多少对l r的gcd(a[l] , ... , a[r]) ...