需要使用绑定属性的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属性告诉模型联编程序填充指定名称的属性。

所以在这种情况下,只有UsernameFullNameEmail属性会被填充。 所有其他人将被忽略。

详情请看这里: 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更为安全的原因是,当您将新属性添加到实体时,新字段不会被“排除”列表自动保护。