需要使用绑定属性的MVC操作方法指南
我正在通过一个动作方法代码,我看到一个属性被用在那里,但我真的不明白这个用法。 这里是代码
public ActionResult User([Bind(Include = "Username,FullName,Email")]User user) { if (!ModelState.IsValid()) return View(user); try { user.save() // return the view again or redirect the user to another page } catch(Exception e) { ViewData["Message"] = e.Message; return View(user) } } ([Bind(Include = "Username,FullName,Email")]User user)
我只是不明白上面的行绑定包括等
所以请帮助我理解这种用于在mvc中编写这种代码的属性。 如果有人让我理解他们将使用这个Bind attribute
样本小代码,那将是非常好的帮助。
更新:假设我有从哪里用户只能input名字,姓氏和性别的forms,那么我的行动方法看起来像
public ActionResult Edit(string FirstName,string LastName,string Gender) { // ... }
这将工作,我认为。 那么为什么我应该使用绑定属性,因为我的上述行动方法将正常工作。
Bind
属性使您可以“微调”某个参数Type的模型绑定过程,而无需注册特定于Type的自定义ModelBinder
。
例如,假设你的动作期望一个Person
参数定义如下:
public class Person { public Person(string firstName, string lastName, Gender gender) { this.FirstName = firstName; this.LastName = lastName; if (gender == Gender.Male) this.FullName = "Mr. " + this.FirstName + " " + this.LastName; else this.FullName = "Mrs. " + this.FirstName + " " + this.LastName; } public string FirstName { get; set; } public string LastName { get; set; } public Gender Gender { get; set; } // 'FullName' is a computed column: public string FullName { get; set; } }
而行动:
public ActionResult Edit(Person person) { ... }
现在,如果有人张贴以下JSON:
{ "FirstName":"John", "LastName":"Smith", "Gender":"Male", "FullName":"Mrs. John Smith" }
你的行动现在将有一个错误的FullName
('Mrs'而不是'Mr')的人。
为了避免这种行为,可以使用Bind
属性,并从绑定进程('Black-list')中显式排除FullName
属性:
public ActionResult Edit([Bind(Exclude="FullName")] Person person) { ... }
或者,您可以使用Include
来忽略('Black-list')所有属性,并且只包含('White-list')指定的属性:
public ActionResult Edit([Bind(Include="FirstName,LastName,Gender")] Person person) { ... }
更多信息在MSDN上 。
执行此操作时,MVC模型联编程序将使用请求参数来填充user
参数的属性,正如您可能已经知道的那样。 但是, Bind
属性告诉模型联编程序仅填充指定名称的属性。
所以在这种情况下,只有Username
, FullName
和Email
属性会被填充。 所有其他人将被忽略。
详情请看这里: http : //ittecture.wordpress.com/2009/05/01/tip-of-the-day-199-asp-net-mvc-defining-model-binding-explyly/
Bind属性是防止在创build场景中过度发布的一种方法。 例如,假设Student实体包含一个Secret属性,您不希望这个网页设置。
public class Student { public int ID { get; set; } public string LastName { get; set; } public string FirstMidName { get; set; } public DateTime EnrollmentDate { get; set; } public string Secret { get; set; } public virtual ICollection<Enrollment> Enrollments { get; set; } }
即使网页上没有“秘密”字段,黑客也可以使用诸如fiddler之类的工具,或者编写一些JavaScript来发布“秘密”表单值。 如果没有Bind属性限制模型联编程序创buildStudent实例时使用的字段,则模型联编程序将拾取该“秘密”表单值并使用它创build“学生”实体实例。 然后,无论黑客为“秘密”表单字段指定的值是否会在您的数据库中更新。 下图显示了将提示字段(值为“OverPost”)的提琴手工具添加到发布的表单值。 然后,“OverPost”的值将被成功添加到插入行的Secret属性中,尽pipe您从未打算网页能够设置该属性。
将包含Bind属性的参数用于白名单字段是一个安全的最佳实践。 也可以使用“排除”参数将要排除的字段列入黑名单。 Include更为安全的原因是,当您将新属性添加到实体时,新字段不会被“排除”列表自动保护。
- 我怎样才能使用ASP.NET MVC中的Html.Action()传递参数给一个Action?
- 将ASP.NET MVC Razor @helper函数转换为辅助类的方法
- 如何在EF中更新父实体时添加/更新子实体
- 如何在ASP.NET MVC中创build一个CheckBoxListFor扩展方法?
- 在js文件中,asp.net-mvc:razor'@'符号
- 使用ASP.NET MVC的json请求的401响应代码
- ViewResult()和ActionResult()之间的区别
- MVC web api:没有“Access-Control-Allow-Origin”标题出现在请求的资源上
- 在控制器方法中重新validation修改后的ViewModel?