Mvc内建功能(DefaultModelBinder)自动绑定。
在做Asp.Net MVC项目中,都知道View负责页面展示数据或者提供页面收集数据,而所展示的数据或者收集的数据都是从Controller的Action中获取或提交到Controller的Action。
这里的数据,可能是基础类型,或者是Model,或者是Model的部分内容,或者是集合比如List或Dictionary。
数据从View传递到Controller的Action时,有几种方式,RouteData(url中的路由数据),QueryString(http get的查询参数如?page=2),Forms(表单post的数据), 或者ajax交互的json数据。
而在Controller的action中,常常希望获得这些View传递的数据,并且最好能绑定到Action希望的类型,这些类型可能是Action的基础类型参数,或者需要更新的Model,或者只更新Model的部分内容,或者是一些集合的结构如List或Dictionary。
古董方法:
[AcceptVerbs(HttpVerbs.Post)]
publicActionResultCreate()
{
Reciperecipe = newRecipe();
recipe.Name = Request.Form["Name"];
// ...
returnView();
}
前进一步:
publicActionResultCreate(FormCollection values)
{
Reciperecipe = newRecipe();
recipe.Name = values["Name"];
// ...
returnView();
}
Asp.Net Mvc: Model Binding to Simple Types, Complex Types, Collections, Dictionaries, Etc
转:http://www.cnblogs.com/tristanguo/archive/2009/02/18/1393237.html
环境:
Windows 2008, VS 2008 SP1, Asp.Net Mvc 1.0
------------------------------------------------------------------------------
本文主要实验如何应用Asp.Net Mvc内建功能(DefaultModelBinder)实现简单类型、复杂类型、集合类型,以及字典类型的自动绑定。
1. 简单类型
这里,我们将下面这个Book类称为简单类型:
public class Book
{
public int BookId { get; set; }
public string BookName { get; set; }
public string Author { get; set; }
public DateTime PublishedDate { get; set; }
}
假设现在需要实现添加Book的功能,那么在BookController中,会定义如下的Action:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Book book) {
//TO DO
//Insert book into Database
return RedirectToAction("Index");
}
现在的问题便是,在View中如何命名TextBox来达到自动绑定,如下:
<div>
<%using (Html.BeginForm("Create", "Book")) { %>
<div>
Book Name: <%=Html.TextBox("BookName")%>
</div>
<div>
Author: <%=Html.TextBox("Author")%>
</div>
<div>
Published Date: <%=Html.TextBox("PublishedDate")%>
</div>
<div>
<input type="submit" id="submit" name="submit" value="submit" />
</div>
<%} %>
</div>
注意TextBox的name必须是对应绑定类型的PropertyName(不区分大小写)。 这样,页面表单submit后,我们便可以在BookController的“Create” Action中得到自动绑定的book对象。这里,Asp.Net Mvc还支持在TextBox的name中加上变量名称前缀的情形:
<div>
<%using (Html.BeginForm("Create", "Book")) { %>
<div>
Book Name: <%=Html.TextBox("book.BookName")%>
</div>
<div>
Author: <%=Html.TextBox("book.Author")%>
</div>
<div>
Published Date: <%=Html.TextBox("book.PublishedDate")%>
</div>
<div>
<input type="submit" id="submit" name="submit" value="submit" />
</div>
<%} %>
</div>
需要注意的是: 1)前缀"book"必须与Action中接收的Book参数名一致 2)如果加了前缀,那么所有的都要加
2. 复杂类型
现在对Book类作些许改动,并引入Author类:
public class Book
{
public int BookId { get; set; }
public string BookName { get; set; }
public Author Author { get; set; }
public DateTime PublishedDate { get; set; }
} public class Author {
public int AuthorId { get; set; }
public string AuthorName { get; set; }
public string Nation { get; set; }
}
这里,将改动后的Book类称为复杂类。这时,Book类多了一个对Author类的引用。现在,保持BookController中的"Create" Action不变,来看View中的TextBox改如何命名以实现Book类型的自动绑定:
<div>
<%using (Html.BeginForm("Create", "Book")) { %>
<div>
Book Name: <%=Html.TextBox("BookName")%>
</div>
<div>
Published Date: <%=Html.TextBox("PublishedDate")%>
</div>
<div>
Author's Name: <%=Html.TextBox("Author.AuthorName")%>
</div>
<div>
Author's Nation: <%=Html.TextBox("Author.Nation")%>
</div>
<div>
<input type="submit" id="submit" name="submit" value="submit" />
</div>
<%} %>
</div>
OK,测试通过,想必你也知道命名规则了,要绑定Book类型中的Author类型,必须加上"Author."的前缀。 如果你喜欢,你还可以在所有TextBox名称前面再加"book."的前缀。
3. 集合类型
为避免问题复杂化,我们用回原来的简单Book类型:
public class Book
{
public int BookId { get; set; }
public string BookName { get; set; }
public string Author { get; set; }
public DateTime PublishedDate { get; set; }
}
现在,把BookController的"Create" Action改为接收IList<Book>的参数:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(IList<Book> books) {
//TO DO
//Insert book into Database
return RedirectToAction("Index");
}
然后,在View中运用以下命名规则,以自动绑定IList<book>类型
<div>
<%using (Html.BeginForm("Create", "Book")) { %>
<div>
Book Name: <%=Html.TextBox("books[0].BookName")%>
</div>
<div>
Published Date: <%=Html.TextBox("books[0].PublishedDate")%>
</div>
<div>
Author's Name: <%=Html.TextBox("books[0].Author")%>
</div>
<div>
Book Name: <%=Html.TextBox("books[1].BookName")%>
</div>
<div>
Published Date: <%=Html.TextBox("books[1].PublishedDate")%>
</div>
<div>
Author's Name: <%=Html.TextBox("books[1].Author")%>
</div>
<div>
<input type="submit" id="submit" name="submit" value="submit" />
</div>
<%} %>
</div>
可以看到如下规则:Action的变量名"books"加上中括号和索引作为前缀,索引必须从0开始,并且必须连续。 通过此命名规则,可以绑定任意集合类型:IList<Book>, ICollection<Book>, IEnumerable<Book>, List<Book>, Book[]等。
4. 字典类型
仍以简单Book类型为例,现在将"Create" Action改为接收IDictionary<Book>类型
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(IDictionary<string, Book> books) {
//TO DO
//Insert book into Database
return RedirectToAction("Index");
}
相应的,View中的命名如下:
<div>
<%using (Html.BeginForm("Create", "Book")) { %>
<div>
Book SN: <%=Html.TextBox("books[0].Key") %>
</div>
<div>
Book Name: <%=Html.TextBox("books[0].Value.BookName")%>
</div>
<div>
Published Date: <%=Html.TextBox("books[0].Value.PublishedDate")%>
</div>
<div>
Author's Name: <%=Html.TextBox("books[0].Value.Author")%>
</div>
<div>
Book SN: <%=Html.TextBox("books[1].Key") %>
</div>
<div>
Book Name: <%=Html.TextBox("books[1].Value.BookName")%>
</div>
<div>
Published Date: <%=Html.TextBox("books[1].Value.PublishedDate")%>
</div>
<div>
Author's Name: <%=Html.TextBox("books[1].Value.Author")%>
</div>
<div>
<input type="submit" id="submit" name="submit" value="submit" />
</div>
<%} %>
</div>
可以看出,对于IDictioinary<Book>类型,在命名规则上,相比于集合类型,多了"Key"和"Value”的字眼。另,此规则也适用于Action参数类型为Dictionary<Book>的情形。
总结:
由此看来,只要我们遵循一定的命名规则,就可以轻松实现各种类型的自动绑定了。 当然,Asp.Net Mvc还支持自定义ModelBinder扩展
Mvc内建功能(DefaultModelBinder)自动绑定。的更多相关文章
- asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证
原文:asp.net mvc源码分析-DefaultModelBinder 自定义的普通数据类型的绑定和验证 在前面的文章中我们曾经涉及到ControllerActionInvoker类GetPara ...
- paip.提升效率---request自动绑定domain object
paip.提升效率---request自动绑定domain object #.keyword,subtitle关键字,子标题 ------------------------- 复制request属性 ...
- 基于jquery的表格动态创建,自动绑定,自动获取值
最近刚加入GUT项目,学习了很多其他同事写的代码,感觉受益匪浅. 在GUT项目中,经常会碰到这样一个问题:动态生成表格,包括从数据库中读取数据,并绑定在表格中,以及从在页面上通过jQuery新增删除表 ...
- 最新iOS 6 in Xcode4.5新特性——Storyboard和属性自动绑定
最新iOS 6 in Xcode4.5新特性编程之二(上)——Storyboard和属性自动绑定 从Xcode 4.3开始,Storyboard 就是iOS 5和iOS 6中令人兴奋的一个新特性,他将 ...
- jQuery插件:Ajax将Json数据自动绑定到Form表单
jQuery注册方法的两种常用方式: //jQuery静态方法注册 //调用方法$.a1() $.extend({ a1: function () { console.log("a1&quo ...
- spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器)
spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器) 资源绑定视图解析器 + 内部资源(普通模式)视图解析器 并存方式 内部资源视图解析器: http:// ...
- snowflake机器标识自动绑定
首先附上snowflake源码 package com.yunyihenkey.common.idworker; /** * Twitter_Snowflake<br> * SnowFla ...
- FlexiGrid 使用 全选、自动绑定
1.介绍 Flexigrid是一个类似于Ext Gird,但基于jQuery开发的Grid.它具有的功能包括:可以调整列宽,合并列标题,分页,排序,显示/隐藏表格等.Flexigrid显示的数据能够通 ...
- WinForm开发-界面控件到实体,实体到界面控件自动绑定
在WinForm开发中,我们是不是为绑定界面控件的数据而每个控件每个控件的赋值?在保存修改时是不是也是每个控件每个控件的赋值到实体中?字段一多,那简直就是噩梦.有没有像Web中那样方便的方法直接就自动 ...
随机推荐
- 使用metasploit进行栈溢出攻击-3
有了shellcode,就可以进行攻击了,但是要有漏洞才行,真实世界中的漏洞很复杂,并且很难发现,因此我专门做一个漏洞来进行攻击. 具体来说就是做一个简单的tcp server,里面包含明显的栈溢出漏 ...
- java 获取url及url参数解析
java 获取url及url参数解析 一.url编码:URLEncoder.encode(userName); 二.url解码: URLDecoder.decode(userName);
- 十天入门java教程 Day02
1,常量,变量的理解 常量,程序运行过程中,不能改变的,叫常量. 变量,程序运行过程中,改变的,叫变量. 2,变量的理解 变量,用来存储数据的,数据类型,存放哪种数据的种类. 变量的概念:程序运行期间 ...
- 智能合约安全事故回顾(3)-DOS漏洞导致的KotET事件
现实世界中的网络都是有带宽限制的,想象一下,一个访问量稳定的网站,突然有人利用某种方式爆发式的将网站的访问量提升,这个时候系统会作何反应?如果系统没有合理的防DOS攻击的方式,这种时候往往会造成服务器 ...
- Oracle练习(2)
有如下三张表: 销售表:SALE_FACT 工号 年月 城市 客户 销售额 C00001 201601 上海 A 1000 C00001 201601 上海 B 5000 C000 ...
- 最短路【bzoj2464】: 中山市选[2009]小明的游戏
2464: 中山市选[2009]小明的游戏 Description 小明最近喜欢玩一个游戏.给定一个n * m的棋盘,上面有两种格子#和@.游戏的规则很简单:给定一个起始位置和一个目标位置,小明每一步 ...
- 插头DP学习笔记
插头DP(我也不知道该怎么定义...)是一种类似于洛谷题目([模板]插头DP)的题目 题目特征为: 在棋盘上 某一维的数据范围很小 完全铺满 计数问题 直接看题吧. [模板]插头DP 给出n*m的方格 ...
- 获取3个月前的时间(获取某一天的时间 NSDate) --NSCalendar--NSDateComponents
-(void)getThreeMonthDate:(NSDate *)mydate { NSLog(@"%@",mydate); //1.创建NSCalendar NSCalend ...
- 5.mybatis 多参数传递 -分页
需求 :分页 方法一:使用下标来进行赋值,下标从零开始 mapper.xml <select id="selectByPage" resultMap="blog ...
- vs已停止工作的解决方案
解决办法 第一步: 开始-->所有程序-->Microsoft Visual Studio 2013(2015)-->VisualStudio Tools-->VS2013(2 ...