MVC中的模型maya模型中绑定是什么么?

ASP.NET MVC模型绑定的6个建议
发表于 10:25|
来源博客园|
摘要:ASP.NET MVC中的Model Binding使用起来非常简单,本文总结了关于在MVC项目中更好使用Model Binding的一些建议。供大家学习、参考。
ASP.NET MVC中的Model Binding使用起来非常简单。你的Action方法需要数据,在传入的HTTP请求中携带着你需要的数据,数据可以在请求的表单数据中,还可能在你的URL地址本身中。通过DefaultModelBinder,可以神奇地将表单中的数据和路由中的数据转换到对象中。Model Binder使得你的控制器代码可以干净地从请求以及关联的环境中分离出来。
这里有一些关于在MVC项目中更好使用Model Binding的建议。
Tip#1:最好使用Model Binding而不是Request.Form
如果你的Action像下面这样:
[AcceptVerbs(HttpVerbs.Post)]& &&public&ActionResult&Create()& &&{& &&&&&&Recipe&recipe&=&new&Recipe();& &&&&&&recipe.Name&=&Request.Form[&Name&];& &&&&&&&& &&&&&&//&...& &&&&&&&& &&&&&&return&View();& &&}& &
就不对了。这些属性使得你的Action很难读而且更难以测试,Model Binder可以帮你从Request和HttpContext中摆脱出来。比如,你可以使用FormCollection类型的参数来代替上面的代码:
public&ActionResult&Create(FormCollection&values)& &&{& &&&&&&Recipe&recipe&=&new&Recipe();& &&&&&&recipe.Name&=&values[&Name&];&&&&&&& &&&&&&&&&&&&&&&& &&&&&&//&...& &&&&&&&&&&&&&&&& &&&&&&return&View();& &&}& &
使用FormCollection你可以不必再深入到Request对象,这样,有时候你就可以使用低层次的控制了。但是,如果你的数据来自Request.Form,或者URL请求参数,你可以通过Model Binding来完成它的魔术。
[AcceptVerbs(HttpVerbs.Post)]& &&public&ActionResult&Create(Recipe&newRecipe)& &&{&&&&&&&&&&&&& &&&&&&//&...& &&&&&&&& &&&&&&return&View();& &&}& &
在这个例子中,Model Binder将会帮你创建newRecipe对象,并且使用从Request中获得获得的数据来填充它,真的是魔术。有许多的途径允许你定制绑定的处理过程,使用白名单,黑名单,前缀,以及接口,更多的控制还允许你通过UpdateModel和TryUpdateModel方法进行,只是要注意无意的绑定。看一看Justin Etheredge的文章.
Tip#2定制Model Binder
在MVC中,Model Binding也是一个扩展点。如果默认的绑定不合适的话,你可以提供一个自定义的Model Binder,实现自定义的Model Binder你需要实现接口IModelBinder,这是仅有的一个方法,有多难吗?
public&interface&IModelBinder& &&{& &&&&&&object&BindModel(ControllerContext&controllerContext,& &&&&&&&&&&&&&&&&&&&&&&&&ModelBindingContext&bindingContext);& &&}& &
一旦你进入Model Binding,实际上,你将会发现这个简单的IModelBinder接口并没有完全描述在框架中的默认契约和负作用。如果你退回一步看一看,就会发现Model Binder,ModelState以及HtmlHelper。
Scott Hanselman在他的&&&中给出了一个并不是演示版的Model Binder,一个我需要提出来的细节是Scott的DateTime分离器仍然没有通过Request.Form来绑定,在GetA&T& 方法中,你将会看到Scott使用了上下文对象的ValueProvider属性来获得数据,ValueProvier表示混合了表单数据,路由数据,以及请求参数数据的数据。Scott的例子非常棒,但是,少了一个细节:绑定中的错误。
如果默认的模型绑定器在将数据绑定到你的对象上时出现了问题,它会将错误信息和错误的数据压入到ModelState中,你可以检查ModelState.IsValid来检查绑定中的问题,使用ModelState.AddModelError 方法可以注入你自己的错误信息。
如果你看看Scott文章的回应,你会看到&对这个问题的补丁。如果转换失败,Sebastien的代码将会使用ModelState.AddModelError方法来表示错误。Controller和View都会使用ModelState来检查绑定的问题。Controller需要检查ModelState,以便在将数据保存到数据库之前检查错误,而View需要通过ModelState来为用户提供验证的回应。需要注意的一点是HtmlHelper,你需要同时提供一个值,通过ModelState.SetModelValue,并且提供错误信息,通过AddModelError,否则你将会得到一个运行时的空引用异常,下面的代码演示了这个问题。
[AcceptVerbs(HttpVerbs.Post)]& &&public&ActionResult&Create(FormCollection&Form)& &&{& &&&&&&//&this&is&the&wrong&approach&...& &&&&&&if&(Form[&Name&].Trim().Length&==&0)& &&&&&&&&&&ModelState.AddModelError(&Name&,&&Name&is&required&);& &&&& &&&&&&return&View();& &&}& &
上面的代码创建了一个模型的错误信息,但是没有提供值。也有其他的问题,但是,如果你像下面一场呈现视图,那么,就会得到一个异常。
&%= Html.TextBox(&Name&, Model.Name) %&
纵然你为 Model.Name 提供了一个值,HtmlHelper 也会发现错误,然后显示试图的值。如果你没有提供值,就会看到一个空引用异常。
Tip#3通过继承来自定义Model Binding
如果你决定实现一个自定义的Model Binder,你可能希望通过从DefaultModelBinder继承来减少部分工作量,其实,最终你会发现不能通过继承DefaultModelBinder 来达到你的目的。例如,假如你希望通过自定义的 ModelBinder来创建某些对象,DefaultModelBinder将会使用Activator.CreateInstance和Model的默认构造函数来创建对象,如果你的模型没有提供默认的构造函数,你可以重写CreateModel方法来解决这个问题。
Jimmy有一篇关于使用DefaultModelBinder的派生类的帖子&&.
Tip#4使用注解来完成验证
Brad Wilson在他的文章中,完美地演示了一切。
我建议你仔细读一下Brad Wilson的文章,如果你想快一点,这里总结了一下。
.NET 3.5 SP1带来了ponentModel.DataAnnotations程序集,通过数据的注解和DataAnnotationModelBinder,你可以处理大部分的服务器端验证问题,只需要简单地标注你的模型
public&class&Recipe& &&{& &&&&&&[Required(ErrorMessage=&We&need&a&name&for&this&dish.&)]& &&&&&&[RegularExpression(&^Bacon&)]&& &&&&&&public&string&Name&{&&&}& &&&& &&&&&&//&...& &&}& &
Tip#5绑定和验证是两个步骤
绑定是从环境中获得数据,然后赋予模型对象的过程,验证是检查模型对象的数据,确认符合我们的期望。这是完全不同的操作,但是模型绑定模糊了他们的区别。如果你希望在Model Binder中一起完成这两步工作,是可以的,这需要准确地知道DataAnnotationsModelBinder做了什么,你可以看这几个例子。实际上,经常被忽略的一点是DefaultModelBinder如何分离绑定和验证步骤。如果只是简单属性的验证,所有你要做的就是重写DefaultModelBinder的OnProperValidating方法。
下面的几篇文章可以参考一下:
Tip#6关于绑定的内容
前面我说过:Model Binder可以帮你从Request和HttpContext中摆脱出来。从更加广泛的角度来说,并没有限制数据的来源,请求上下文中包含丰富的客户端信息。Scott Hanselman的另外一篇文章演示了将用户的标识绑定到模型上。
Model Binding是美妙的魔术,所以,尽可能使用内置的奇妙功能。
文章出自:
英文出自:
推荐阅读相关主题:
网友评论有(0)
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章为了学习 ASP.NET MVC,我们将构建一个 Internet 应用程序。
部分 7:添加数据模型。
MVC 模型包含所有应用程序逻辑(业务逻辑、验证逻辑、数据访问逻辑),除了纯视图和控制器逻辑。
通过 MVC,模型可保存并操作应用程序数据。
Models 文件夹
Models 文件夹包含表示应用程序模型的类。
Visual Web Developer 自动创建一个 AccountModels.cs 文件,包含用于应用程序安全的模型。
AccountModels 包含 LogOnModel、ChangePasswordModel 以及 RegisterModel。
添加数据库模型
本教程所需的数据库模型能够通过以下几个简单的步骤来创建:
在解决方案管理器中,右键点击 Models 文件夹,选择添加、类。
对类 MovieDB.cs 进行命名,然后点击添加。
编辑这个类:
using System.Collections.G
using System.L
using System.W
using System.Data.E
namespace MvcDemo.Models
public class MovieDB
public int ID { }
public string Title { }
public string Director { }
public DateTime Date { }
public class MovieDBContext : DbContext
public DbSet&MovieDB& Movies { }
注释:我们已经把这个表命名为 &MovieDBs& (以 s 结尾)。在前一章,我们看到了用于数据库表的名称 &MovieDBs& (以 s 结尾) 用于数据模型。觉得有点陌生是不是,不过这是确保控制器与数据库表进行链接的命名惯例。
添加数据库控制器
本教程所需的数据库控制器能够通过以下几个简单的步骤来创建:
重建您的项目:选择测试,然后从菜单中选择 Build MvcDemo。
在解决方案资源管理器中,右键点击 Controllers 文件夹,然后选择添加、控制器。
把控制器名称设置为 MoviesController
选择模板:Controller with read/write actions and views, using Entity Framework
选择模型类:MovieDB (MvcDemo.Models)
选择 data context 类:MovieDBContext (MvcDemo.Models)
选择视图 Razor (CSHTML)
Visual Web Developer 将创建如下文件:
Controllers 文件夹中的 MoviesController.cs 文件
Views 文件夹中的 Movies 文件夹
添加数据库视图
以下文件会被自动地在 Movies 文件夹中创建:
Create.cshtml
Delete.cshtml
Details.cshtml
Edit.cshtml
Index.cshtml
祝贺您。您已经向应用程序添加了第一个 MVC 数据类型。
现在,您能够在&电影&标签页上点击了。MVC相关(11)
这一章主要记录一下MVC模型绑定
一.认识模型绑定
官方详细介绍模型绑定的资料我没找到,只是在MSDN上讲时介绍了一下:将浏览器请求映射到数据对象。
这句话刚看上去不大明白意思,还是用自己的话总结一下:
模型绑定实际上是:
服务器端代码利用用户在表单中输入的数据(或其它HTTP请求携带的数据),来构造动作方法所需要的参数对象的过程。数据的流向是从客户端的HTML表单到服务器端动作方法。
更进一层的解释是:
当我们在浏览器输入一个地址即访问一个动作时,动作调用器会负责在调用方法之前获取该方法所需的所有参数。而默认动作调用器依赖于模型绑定来获取动作方法中的参数值。其中每一个参数依赖于各自的模型绑定器,它们可能是用户自定义的模型绑定器,也可能是默认的模型绑定器。
下面从一个简单的示例开始演示一下默认模型绑定器。
二.使用默认模型绑定
1)绑定简单类型
打开VS,新建一个空模板的MVC 3项目如下:
在Models文件夹下面新建一个Sheep类文件,如下:
namespace MvcModelBind.Models
public class Sheep
private string _name = &No name!&;
public string Name
get { return _ }
set { _name = }
}在Controllers文件夹下添加一个控制器,如下:
在该控制器下新建一个方法,注意添加Sheep的引用:
public ActionResult ModelBindSheep(Sheep sheep)
return View(sheep);
}F6编译项目,为上面的方法新建一个强类型视图,如下:
将视图代码修改为:
@model MvcModelBind.Models.Sheep
ViewBag.Title = &ModelBindSheep&;
&h2&ModelBinding示例:绑定Sheep对象的Name属性&/h2&
@using (Html.BeginForm(&ModelBindSheep&, &Sheep&))
@:小羊的名字:@Html.TextBoxFor(n =& n.Name, new { style = &background-color:#FF83FA& })&br /&
@:目前小羊的名字是:@Model.Name &br /&
&input type=&submit& name=&btn& value=&提交& /&
}运行查看网页:注意将网址改成对应的:/控制器名/action名:
更改名字,点击提交按钮会看到名字随之变化,这里断点进action方法里看一下,具体的方法参数值:
实际上,上面的模型绑定流程大体上可以分为如下:
1)当我们点击提交按钮时,模型绑定器发现页面需要绑定一个Sheep类,而且这个类有一个string型的属性Name需要赋值;
2)于是模型绑定器就要找能为这个Name属性赋值的数据源。它首先在表单中查找,结果发现TextBox的name值是“Name”,于是就认为这个控件的值可以为Sheep类 & & & &的Name属性赋值;
3)于是模型绑定器就将textBox的value值取出来,转化成能为Sheep类的Name属性赋值的类型(这里转化为string),并将转化后的值赋给Sheep类的Name属性;
4)赋值完成后,模型绑定器就能构造出一个Sheep类的实例对象,该对象里的属性值都是刚刚从表单中取出绑定过来的。然后将这个实例对象送给动作调用器;
5)动作调用器在调用action方法之前,将收到的实例对象注入到动作方法的参数里去。对应上面的示例,就是注入到参数sheep中。
经过上述几部,才有我们在断点时监视到的参数sheep的Name属性值随TextBox值变化而变化的情形。
如果要说什么是默认模型绑定,那么上面的便是咯
注:上面演示的示例,模型绑定器是在表单中找到与参数名(Name)匹配的数据源的;实际上默认的模型绑定器不仅仅会从表单中查找,它查找数据源的顺序是:
1.用户在HTML表单form中提供的值;(即Request.Form)
2.从应用程序路由获得的值;(即RouteData.Values)
3.URL中查询字符串部分的值;(即Request.QueryString)
4.请求中的上传文件。(即Request.Files)
以上,默认绑定器只要找到一个值,搜索便会停止。
2)绑定复合类型
a)绑定复合类型简单示例
上面绑定的仅仅是一个string型的属性Name,接下来绑定一个复杂类型AdditionalInformation AddInfo
其中AdditionalInformation 定义如下:
namespace MvcModelBind.Models
public class AdditionalInformation
public string Country { }
public string City { }
在Sheep类中添加一个新的复合属性AddInfo:
public class Sheep
private string _name = &No name!&;
public string Name
get { return _ }
set { _name = }
public AdditionalInformation AddInfo { }
}更改ModelBindSheep方法对应的视图代码为:
@model MvcModelBind.Models.Sheep
ViewBag.Title = &ModelBindSheep&;
&h2&ModelBinding示例:绑定Sheep对象的Name属性&/h2&
@using (Html.BeginForm(&ModelBindSheep&, &Sheep&))
@:小羊的名字:@Html.TextBoxFor(n =& n.Name, new { style = &background-color:#FF83FA& })&br /&
@:目前小羊的名字是:@Model.Name &br /&
@:小羊所在国家: @Html.EditorFor(c=&c.AddInfo.Country) &br /&
@:小羊所在的城市: @Html.EditorFor(c=&c.AddInfo.City) &br /&
&input type=&submit& name=&btn& value=&提交& /&
}运行查看网页,对应的国家及城市Html源码:
小羊所在国家: &input class=&text-box single-line& id=&AddInfo_Country& name=&AddInfo.Country& type=&text& value=&& /& &br /&
小羊所在的城市: &input class=&text-box single-line& id=&AddInfo_City& name=&AddInfo.City& type=&text& value=&& /& &br /&可以看到name属性是模型Sheep类的AddInfo属性名+对应的AdditionalInformation类的Country/City属性名组合而成。
实际上可以完全手动写上面的HTML代码,而不必借用Html辅助器,只不过用支持Lambda表达式的Html辅助器生成网页源码比较方便而已。
b)指定自定义前缀
前面所有的示例都有一个共同的特点就是:视图中仅仅绑定了一个模型类,即一个Sheep类型的model
@model MvcModelBind.Models.Sheep我在视图代码中增加另一个Sheep实例:
@using MvcModelBind.M
@model MvcModelBind.Models.Sheep
Sheep anotherSheep = new Sheep
Name = &Tom&,
AddInfo = new AdditionalInformation { Country = &America&, City = &sanfrancisco& }
ViewBag.Title = &ModelBindSheep&;
&h2&ModelBinding示例:绑定Sheep对象的Name属性&/h2&
@using (Html.BeginForm(&ModelBindSheep&, &Sheep&))
@:这是当前小羊的名字: @Html.EditorFor(a=&a.Name) &br /&
@:这是当前小羊的国家: @Html.EditorFor(a=&a.AddInfo.Country) &br /&
@:这是当前小羊的城市: @Html.EditorFor(a=&a.AddInfo.City)
&p &--------------------------------------------------------&/p&
@:这是额外小羊的名字: @Html.EditorFor(a=&anotherSheep.Name) &br /&
@:这是额外小羊的国家: @Html.EditorFor(a=&anotherSheep.AddInfo.Country) &br /&
@:这是额外小羊的城市: @Html.EditorFor(a=&anotherSheep.AddInfo.City) &br /&
&input type=&submit& name=&btn& value=&提交& /&
}编译运行,无论我如何修改虚线下面的三个TextBox的值,点击提交按钮后这三个TextBox始终是显示:
这说明虚线下面的三个根本就没参与模型绑定。在对应的动作方法中添加一个参数:
public ActionResult ModelBindSheep(Sheep sheep,Sheep sheep1)
return View(sheep);
}编译运行,还是和上面一样,无论我如何修改虚线下面的三个TextBox的值,点击提交按钮后这三个TextBox始终是恢复上图的样子。
其实模型绑定器在查找sheep1对应的参数值时,会去查找name为sheep1.Name/AddInfo.Country/AddInfo.City的数据源,发现压根就找不到,所以点击提交按钮后,虚线下面的三个TextBox又恢复原值。
看一下页面这三个TextBox对应的name:
&p &--------------------------------------------------------&/p&
这是额外小羊的名字: &input class=&text-box single-line& id=&anotherSheep_Name& name=&anotherSheep.Name& type=&text& value=&Tom& /& &br /&
这是额外小羊的国家: &input class=&text-box single-line& id=&anotherSheep_AddInfo_Country& name=&anotherSheep.AddInfo.Country& type=&text& value=&America& /& &br /&
这是额外小羊的城市: &input class=&text-box single-line& id=&anotherSheep_AddInfo_City& name=&anotherSheep.AddInfo.City& type=&text& value=&sanfrancisco& /& &br /&可见,这些name都有一个前缀:anotherSheep,这是我在视图中定义的额外Sheep类的实例名。
这样一来,我就可以将动作方法中第二个参数名改成anotherSheep,来实现正确的模型绑定:
public ActionResult ModelBindSheep(Sheep sheep, Sheep anotherSheep)
return View(sheep);
}这时候,编译运行,修改这三个TextBox值,提交页面,会发现值都会随之变化了;
其实除了将方法的第二个参数名改成anotherSheep外,还有另一种方法,见下:
public ActionResult ModelBindSheep(Sheep sheep,[Bind(Prefix=&anotherSheep&)] Sheep sheep1)
return View(sheep);
}该方式是利用Bind注解属性来告诉模型绑定器找数据源时,应该找数据源name以什么来开头的。
c)绑定或不绑定某些属性
假如我不想绑定Sheep中的Name属性,只想绑定AddInfo属性,但是我前台页面又有对应的Name数据源,因为绑定器会自动找到并绑定它。
可以利用Bind注解属性:
public ActionResult ModelBindSheep([Bind(Include=&AddInfo&)] Sheep sheep)
return View(sheep);
public ActionResult ModelBindSheep([Bind(Exclude=&Name&)] Sheep sheep)
return View(sheep);
}或者在类定义上使用:
[Bind(Exclude = &Name&)]
public class Sheep
private string _name = &No name!&;
public string Name
get { return _ }
set { _name = }
public AdditionalInformation AddInfo { }
[Bind(Include = &AddInfo&)]
public class Sheep
private string _name = &No name!&;
public string Name
get { return _ }
set { _name = }
public AdditionalInformation AddInfo { }
但是一个需要注意的是:如果在类定义上使用了:
[Bind(Exclude = &Name&)] 又在动作方法参数上使用了:
[Bind(Include=&Name&)] 那么,这个Name属性仍然是不会被绑定的!
3)绑定到集合
上面的示例均是绑定的单独对象,即使使用额外对象也是屈指可数,实际应用中可能会要求绑定几十到几百个对象。
下面以一个简单的示例介绍绑定到集合,将原先的视图代码修改为:
@using MvcModelBind.M
@model List&MvcModelBind.Models.Sheep&
ViewBag.Title = &ModelBindSheep&;
int i = 0;
&h2&绑定到集合&/h2&
@using (Html.BeginForm(&ModelBindSheep&, &Sheep&))
for ( i = 0; i & Model.C i++)
@:第 @(i+1) 只羊的名字: @Html.EditorFor(n=&n[i].Name) &br /&
@:第 @(i+1) 只羊的国家: @Html.EditorFor(n=&n[i].AddInfo.Country) &br /&
@:第 @(i+1) 只羊的城市: @Html.EditorFor(n=&n[i].AddInfo.City) &br /&
&p&----------------------------------------------------&/p&
&input type=&submit& name=&btn& value=&提交& /&
对应的方法修改为:
public ActionResult ModelBindSheep(List&Sheep& sheeps)
if (sheeps==null)
sheeps = new List&Sheep&()
new Sheep { Name=&Tom& , AddInfo=new AdditionalInformation{Country=&China&,City=&ShangHai&}},
new Sheep { Name=&Jack& , AddInfo=new AdditionalInformation{Country=&America&,City=&sanfrancisco&}},
new Sheep { Name=&Jerry& , AddInfo=new AdditionalInformation{Country=&France&,City=&London&}},
return View(sheeps);
}编译运行:
对应表单中的源码:
&form action=&/Sheep/ModelBindSheep& method=&post&&
第 1 只羊的名字: &input class=&text-box single-line& name=&[0].Name& type=&text& value=&Tom& /&
第 1 只羊的国家: &input class=&text-box single-line& name=&[0].AddInfo.Country& type=&text& value=&China& /&
第 1 只羊的城市: &input class=&text-box single-line& name=&[0].AddInfo.City& type=&text& value=&ShangHai& /&
&p&----------------------------------------------------&/p&
第 2 只羊的名字: &input class=&text-box single-line& name=&[1].Name& type=&text& value=&Jack& /&
第 2 只羊的国家: &input class=&text-box single-line& name=&[1].AddInfo.Country& type=&text& value=&America& /&
第 2 只羊的城市: &input class=&text-box single-line& name=&[1].AddInfo.City& type=&text& value=&sanfrancisco& /&
&p&----------------------------------------------------&/p&
第 3 只羊的名字: &input class=&text-box single-line& name=&[2].Name& type=&text& value=&Jerry& /&
第 3 只羊的国家: &input class=&text-box single-line& name=&[2].AddInfo.Country& type=&text& value=&France& /&
第 3 只羊的城市: &input class=&text-box single-line& name=&[2].AddInfo.City& type=&text& value=&London& /&
&p&----------------------------------------------------&/p&
&input type=&submit& name=&btn& value=&提交& /&
&/form&修改对应TextBox的值,提交表单后,可以看到值都随之变化,说明绑定成功!
4)绑定非数字索引的集合
这里借助于隐藏Input元素,作为指定数据的的键,只要将表单中的视图代码修改为:
@using (Html.BeginForm(&ModelBindSheep&, &Sheep&))
&input type=&hidden& name=&index& value=&firstSheep& /&
@:第 @(i+1) 只羊的名字: @Html.Editor(&[firstSheep].Name&) &br /&
@:第 @(i+1) 只羊的国家: @Html.Editor(&[firstSheep].AddInfo.Country&) &br /&
@:第 @(++i) 只羊的城市: @Html.Editor(&[firstSheep].AddInfo.City&) &br /&
&p&----------------------------------------------------&/p&
&input type=&hidden& name=&index& value=&secondSheep& /&
@:第 @(i+1) 只羊的名字: @Html.Editor(&[secondSheep].Name&) &br /&
@:第 @(i+1) 只羊的国家: @Html.Editor(&[secondSheep].AddInfo.Country&) &br /&
@:第 @(++i) 只羊的城市: @Html.Editor(&[secondSheep].AddInfo.City&) &br /&
&p&----------------------------------------------------&/p&
&input type=&hidden& name=&index& value=&thirdSheep& /&
@:第 @(i+1) 只羊的名字: @Html.Editor(&[thirdSheep].Name&) &br /&
@:第 @(i+1) 只羊的国家: @Html.Editor(&[thirdSheep].AddInfo.Country&) &br /&
@:第 @(i+1) 只羊的城市: @Html.Editor(&[thirdSheep].AddInfo.City&) &br /&
&input type=&submit& name=&btn& value=&提交& /&
5)绑定到字典
同样借助于隐藏input元素,只不过元素的name属性变成了字典的键,修改视图代码为如下:
@using MvcModelBind.M
@model Dictionary&string,MvcModelBind.Models.Sheep&
ViewBag.Title = &ModelBindSheep&;
int i = 0;
&h2&绑定到字典&/h2&
@using (Html.BeginForm(&ModelBindSheep&, &Sheep&))
&input type=&hidden& name=&[0].key& value=&firstSheep& /&
@:第 @(i+1) 只羊的名字: @Html.Editor(&[0].value.Name&) &br /&
@:第 @(i+1) 只羊的国家: @Html.Editor(&[0].value.AddInfo.Country&) &br /&
@:第 @(++i) 只羊的城市: @Html.Editor(&[0].value.AddInfo.City&)
&p&----------------------------------------------------&/p&
&input type=&hidden& name=&[1].key& value=&secondSheep& /&
@:第 @(i+1) 只羊的名字: @Html.Editor(&[1].value.Name&) &br /&
@:第 @(i+1) 只羊的国家: @Html.Editor(&[1].value.AddInfo.Country&) &br /&
@:第 @(++i) 只羊的城市: @Html.Editor(&[1].value.AddInfo.City&)
&p&----------------------------------------------------&/p&
&input type=&hidden& name=&[2].key& value=&thirdSheep& /&
@:第 @(i+1) 只羊的名字: @Html.Editor(&[2].value.Name&) &br /&
@:第 @(i+1) 只羊的国家: @Html.Editor(&[2].value.AddInfo.Country&) &br /&
@:第 @(++i) 只羊的城市: @Html.Editor(&[2].value.AddInfo.City&) &br /&
&input type=&submit& name=&btn& value=&提交& /&
对应的方法修改为:
public ActionResult ModelBindSheep(Dictionary&string,Sheep& sheeps)
if (sheeps == null)
sheeps = new Dictionary&string, Sheep&();
sheeps.Add(&firstSheep&, new Sheep { Name=&Tom& , AddInfo=new AdditionalInformation{Country=&China&,City=&ShangHai&}});
sheeps.Add(&secondSheep&, new Sheep { Name = &Jack&, AddInfo = new AdditionalInformation { Country = &America&, City = &sanfrancisco& }});
sheeps.Add(&thirdSheep&, new Sheep { Name = &Jerry&, AddInfo = new AdditionalInformation { Country = &France&, City = &London& }});
return View(sheeps);
}编译运行,修改TextBox的值,点击提交按钮,同样是可以实现绑定的!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:24739次
排名:千里之外
原创:36篇
(1)(2)(1)(1)(1)(2)(3)(1)(4)(1)(1)(3)(12)(1)(1)(1)}

我要回帖

更多关于 mvc绑定下拉列表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信