[置顶] 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绑定器想象成一个大的容 ...
随机推荐
- Oracle数据库启动时:ORA-00119: invalid specification for system parameter LOCAL_LISTENER; ORA-00132错误解决
问题描述: 1. em打开中提示 https://localhost:1158/em/console/database/instance/repDown?target=orclweng&typ ...
- [转] ArcGIS engine中气泡标注的添加、修改
小生 原文 ArcGIS engine中气泡标注的添加.修改! 你微微地笑着,不同我说什么话.而我觉得,为了这个,我已等待得久了. ...
- UI篇--android实现底部按钮布局
1.采用LinearLayout布局: <LinearLayout android:id="@+id/main" android:layout_width="fil ...
- UI篇---RadioButton(单选按钮)
单选按钮RadioButton在Android平台上也应用的非常多,比如一些选择项的时候,会用到单选按钮,实现单选按钮由两部分组成,也就是RadioButton和RadioGroup配合使用 Radi ...
- Selenium2Library系列 keywords 之 _SelectElementKeywords 之 page_should_contain_list(self, locator, message='', loglevel='INFO')
def page_should_contain_list(self, locator, message='', loglevel='INFO'): """Verifies ...
- 为Fitnesse-20140630定制RestFixture代码
摘要:Fitnesse插件RestFixture在最新版Fitnesse输出测试结果为html文本,而非html.本博文记录RestFixture定制代码的过程. 准备开发环境 假定你已经正确安装JD ...
- OpenGL超级宝典第5版&&开发环境搭建
参考:http://www.zyh1690.org/build-opengl-super-bible-fifth-edition-development-environment/ 环境搭建的测试环境为 ...
- 基本输入输出系统BIOS---键盘输入
基本输入输出系统BIOS概述 硬盘操作系统DOS建立在BIOS的基础上,通过BIOS操纵硬件,例如DOS调用BIOS显示I/O程序完成输入显示,调用打印I/O完成打印输出 通常应用程序应该调用DOS提 ...
- 【转】JS设计模式开篇
(原文地址:http://blog.chinaunix.net/uid-26672038-id-3904513.html) 本文主要讲述一下,什么是设计模式(Design patter ...
- 1.2……初识Android开发
Android体系结构 Dalvik VM(Android下的java虚拟机)与传统的JVM的区别 传统JVM 基于堆栈的架构 编写.java文件--->编译为.class文件--->打包 ...