Подтвердить что ты не робот

Нужна справочная строка для метода действия MVC с атрибутом Bind

Я просматривал код метода действия, и я увидел, что там был использован один атрибут, но я действительно не понимал его использования. вот код

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)

Я просто не понимаю вышеприведенную строку Bind include etc

поэтому, пожалуйста, помогите мне понять этот атрибут и когда люди пишут этот код в mvc. это будет действительно хорошая помощь, если кто-то заставляет меня понять примерный небольшой код, где они будут использовать этот Bind attribute.

Update: Предположим, что у меня есть форма, из которой пользователь может вводить только FirstName, LastName и Gender, тогда мой метод действия выглядит как

public ActionResult Edit(string FirstName,string LastName,string Gender)
{
    // ...
}

Это будет работать, я думаю. то почему я должен использовать атрибут Bind, потому что мой метод действия будет работать нормально.

4b9b3361

Ответ 1

Атрибут

Bind позволяет вам "точно настроить" процесс привязки модели к определенному параметру "Тип" без регистрации настраиваемого 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"
}

Теперь у вашего Action будет Person с неправильным FullName ('Mrs' вместо 'Mr').

Чтобы избежать такого поведения, вы можете использовать атрибут Bind и явно исключить свойство FullName из процесса привязки ( "Черный список" ):

public ActionResult Edit([Bind(Exclude="FullName")] Person person)
{
    ...
}

В качестве альтернативы вы можете использовать Include для игнорирования всех свойств ( "Черный список" ) и включения ( "Белый список" ) указанных свойств:

public ActionResult Edit([Bind(Include="FirstName,LastName,Gender")] Person person)
{
    ...
}

Дополнительная информация о MSDN.

Ответ 2

Когда это действие выполняется, связующее устройство модели MVC будет использовать параметры запроса для заполнения параметров параметра user, как вы уже знаете. Однако атрибут Bind указывает связующемуся модели только заполнять свойства с указанными именами.

Таким образом, в этом случае будут заполнены только свойства Username, FullName и Email. Все остальные будут проигнорированы.

Подробнее см. здесь http://ittecture.wordpress.com/2009/05/01/tip-of-the-day-199-asp-net-mvc-defining-model-binding-explicitly/

Ответ 3

Атрибут Bind - это один из способов защиты от чрезмерного размещения в сценариях создания. Например, предположим, что объект 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; }
}

Даже если у вас нет секретного поля на веб-странице, хакер может использовать такой инструмент, как скрипач или написать некоторый JavaScript, чтобы опубликовать значение секретной формы. Без атрибута Bind, ограничивающего поля, которые использует связующее устройство модели, когда он создает экземпляр Student, связующее устройство моделирует это значение секретной формы и использует его для создания экземпляра объекта Student. Тогда любое значение, которое хакер, указанный для поля секретной формы, будет обновлен в вашей базе данных. На следующем рисунке показан инструмент fiddler, добавляющий поле Secret (со значением "OverPost" ) к опубликованным значениям формы. Значение "OverPost" затем будет успешно добавлено в свойство "Секрет" вставленной строки, хотя вы никогда не предполагали, что веб-страница сможет установить это свойство.

Лучше всего использовать параметр Include с атрибутом Bind для полей whitelist. Также возможно использовать параметр Exclude для полей черного списка, которые вы хотите исключить. Причина Include более безопасна в том, что когда вы добавляете новое свойство в объект, новое поле автоматически не защищается списком Exclude.