ASP.NET MVC:如何使用BindAttribute来定制Model绑定的Properties?
2009-12-11 14:46
686 查看
环境:
Windows 2008, VS 2008 SP1, Asp.Net Mvc RC1
------------------------------------------------------------------------------
前文我们讲述了如何实现自定义的ModelBinder,本文继续研究如何使用BindAttribute来定制Model绑定的Properties.
我们再次上一篇文章提到的Book类,BookController.Create Action,以及Create的View
Book类:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/5ec5e35771b445571db9ec7934b20eec.gif)
Create Action:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/52e12ef2af9407a87c3a3a6004a066a3.gif)
对应的View:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/39c38d0f41927abb73ccd7440df33acd.gif)
请注意,这里我们没有应用前一篇文章讲述的自定义ModelBinder。现在,当我们提交表单的时候,在Create的Action中,我们可以得到一个Book实例,这个实例的BookName, Author, PublishedDate均已如所期望的得到相应的表单的值。
好,现在,由于某些原因,有可能是安全性的考虑等等,我希望在Action中,仅自定绑定可靠的来自表单的值,也就是说,我希望对Model自定绑定的Property做过滤。
在Asp.Net Mvc中,BindAttribute充当了这样的角色。
BindAttribute中有三个重要的成员:string Exclude, string Include, string Prefix。
"Exclude"用于指定要排除的Property,"Include"用于指定包含在内的Property,"Prefix"用于指定前缀。
先说,"Prefix"吧,默认情况下,DefaultModelBinder可以自动识别以Action的参数名命名的前缀,也就是说,在上述View中,给每个TextBox的名称都加一个"book“前缀,不需要在做任何改动,在Action中仍可得到Book的实例。
加上前缀”book"的View:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/3d3e24ee1222aca2e8b710a7f5a15698.gif)
这时,如果我们加的前缀不是"book",那么就需要BindAttribute的协助了,
假设,我们加上一个"b"的前缀:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/edfcd557283f22e23f2b55fea71f9002.gif)
那么,为了在Action中得到相应的Book实例,需要在Action的Book参数上应用BindAttribute:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/f25ad749171e3113f981f615b8ba6850.gif)
现在来看"Exclude"和"Include",其实这两个东西一次应用一个就可以了。现在我希望Binding的时候将"BookName"和"Author"都排除(当然,这里这样做没什么意义)。出于简化问题的考虑,View去掉TextBox名称的前缀:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/39c38d0f41927abb73ccd7440df33acd.gif)
然后,将Action改为:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/f638beca1616782d47ce42ac4459b98f.gif)
默认情况下,多个Property用逗号隔开。
BindAttribute出了可以应用在Action的参数上外,还可以应用在Model类定义中:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/a25c77de7ad9adc1240159bc7b22e811.gif)
如果在Model类定义中,和在Action的参数上都应用了BindAttribute,那么则会取两者的交集。个人认为,还是应尽量避免它们打架为妙。
好了,BindAttribute就讲到这,本来要结合BindAttribute继续改进上一篇文章的SimpleModelBinder,还是留待下一篇文章吧。
Copyright作者: Tristan G
本文版权归作者和博客园共有,欢迎转载 :-)
Windows 2008, VS 2008 SP1, Asp.Net Mvc RC1
------------------------------------------------------------------------------
前文我们讲述了如何实现自定义的ModelBinder,本文继续研究如何使用BindAttribute来定制Model绑定的Properties.
我们再次上一篇文章提到的Book类,BookController.Create Action,以及Create的View
Book类:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/5ec5e35771b445571db9ec7934b20eec.gif)
Create Action:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/52e12ef2af9407a87c3a3a6004a066a3.gif)
对应的View:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/39c38d0f41927abb73ccd7440df33acd.gif)
请注意,这里我们没有应用前一篇文章讲述的自定义ModelBinder。现在,当我们提交表单的时候,在Create的Action中,我们可以得到一个Book实例,这个实例的BookName, Author, PublishedDate均已如所期望的得到相应的表单的值。
好,现在,由于某些原因,有可能是安全性的考虑等等,我希望在Action中,仅自定绑定可靠的来自表单的值,也就是说,我希望对Model自定绑定的Property做过滤。
在Asp.Net Mvc中,BindAttribute充当了这样的角色。
BindAttribute中有三个重要的成员:string Exclude, string Include, string Prefix。
"Exclude"用于指定要排除的Property,"Include"用于指定包含在内的Property,"Prefix"用于指定前缀。
先说,"Prefix"吧,默认情况下,DefaultModelBinder可以自动识别以Action的参数名命名的前缀,也就是说,在上述View中,给每个TextBox的名称都加一个"book“前缀,不需要在做任何改动,在Action中仍可得到Book的实例。
加上前缀”book"的View:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/3d3e24ee1222aca2e8b710a7f5a15698.gif)
这时,如果我们加的前缀不是"book",那么就需要BindAttribute的协助了,
假设,我们加上一个"b"的前缀:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/edfcd557283f22e23f2b55fea71f9002.gif)
那么,为了在Action中得到相应的Book实例,需要在Action的Book参数上应用BindAttribute:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/f25ad749171e3113f981f615b8ba6850.gif)
现在来看"Exclude"和"Include",其实这两个东西一次应用一个就可以了。现在我希望Binding的时候将"BookName"和"Author"都排除(当然,这里这样做没什么意义)。出于简化问题的考虑,View去掉TextBox名称的前缀:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/39c38d0f41927abb73ccd7440df33acd.gif)
然后,将Action改为:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/f638beca1616782d47ce42ac4459b98f.gif)
默认情况下,多个Property用逗号隔开。
BindAttribute出了可以应用在Action的参数上外,还可以应用在Model类定义中:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202005/09/a25c77de7ad9adc1240159bc7b22e811.gif)
如果在Model类定义中,和在Action的参数上都应用了BindAttribute,那么则会取两者的交集。个人认为,还是应尽量避免它们打架为妙。
好了,BindAttribute就讲到这,本来要结合BindAttribute继续改进上一篇文章的SimpleModelBinder,还是留待下一篇文章吧。
Copyright作者: Tristan G
本文版权归作者和博客园共有,欢迎转载 :-)
相关文章推荐
- 深入分析 ASP.NET Mvc 1.0 – 4. 使用ModelBinder绑定Action的参数
- 使用ModelBinder绑定IPrincipal (User)简化ASP.NET MVC单元测试
- 在ASP.NET MVC中使用Knockout实践02,组合View Model成员、Select绑定、通过构造器创建View Model,扩展View Model方法
- 如何应用Asp.Net Mvc内建功能(DefaultModelBinder)实现简单类型、复杂类型、集合类型,以及字典类型的自动绑定
- 如何使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
- ASP.NET MVC:如何提供 Controller 继承体系使用的 ModelBinder?
- [记录]ASP.NET MVC 2.0 如何使用Html.RadioButtonFor?
- ASP.NET MVC Model绑定(二)
- ASP.NET MVC Model绑定(三)
- ASP.NET 中如何在使用Eval()绑定数据时使用三元运算符
- [ASP.NET MVC]如何定制Numeric属性/字段验证消息
- ASP.NET MVC Model绑定(四) 推荐
- 在ASP.NET MVC中使用Knockout实践01,绑定Json对象
- ASP.NET MVC 3 —— Model的使用?
- ASP.NET 中如何在使用Eval()绑定数据时使用三元运算符
- [ASP.NET MVC]如何定制Numeric属性/字段验证消息
- ModelBinder——ASP.NET MVC Model绑定的核心
- asp.net core mvc中如何把二级域名绑定到特定的控制器上
- ModelBinder——ASP.NET MVC Model绑定的核心
- 如何使用jQuery向asp.net Mvc传递复杂json数据