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

Когда и почему вы используете TryUpdateModel в asp.net mvc 2?

Кажется, я не могу найти только образец базового кода, чтобы увидеть, как работает TryUpdateModel? Когда вы используете его и почему?

4b9b3361

Ответ 1

Этот метод можно использовать для обновления модели, которая поддерживает определенный вид через данный контроллер. Например, если у меня есть представление, отображающее объект Foo с панелью свойств, заполненной текстовым полем, я могу вызвать метод Save() на контроллере и вызвать TryUpdateModel, чтобы попытаться обновить Foo.

public class Foo {
  public string Bar { get; set; }
}

// ... in the controller
public ActionResult Save() {
  var myFoo = new Foo();
  TryUpdateModel(myFoo);
}

Это попытается обновить модель с заданным значением для Bar. Если обновление не проходит проверку (скажем, например, что Бар был целым числом, а текстовое поле имело в нем текст "привет" ), то TryUpdateModel будет передавать обновление ViewData ModelState с ошибками проверки, и на вашем представлении будут отображаться ошибки проверки.

Обязательно обратите внимание на предупреждение безопасности для .NET Framework 4 в документации MSDN:

Примечание по безопасности. Используйте один из [Перегрузка: System.Web.Mvc.Controller.TryUpdateModel``1] методы, которые берут либо список свойства для включения (белый список) или список свойств для исключения (a черный список). Если явный белый список или черный список, [Перегрузка: System.Web.Mvc.Controller.TryUpdateModel`1] метод пытается обновить каждую публикацию свойство в модели, для которой является соответствующим значением в запрос. Злоумышленник может используйте это для обновления свойства, которые вы не собираетесь предоставить доступ.

https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.tryupdatemodel(v=vs.100).aspx

Ответ 2

TryUpdateModel() позволяет привязывать параметры к вашей модели внутри вашего действия. Это полезно, если вы хотите загрузить свою модель из базы данных, а затем обновить ее на основе пользовательского ввода, а не выводить всю модель из пользовательского ввода.

public ActionResult Update(int id) {
    var service = new ServiceClass();
    var record = service.LoadModel(id);
    if (!TryUpdateModel(record)) {
        // There was an error binding data
        return View();
    }
    // Everything was ok, now save the record back to the database
    service.SaveModel(record);
    return View("Success");
}

В этом отношении он действует аналогично UpdateModel(), но возвращает true при успешности и false, если есть ошибка. UpdateModel() выдает исключение, если есть ошибка, для которой требуется немного больше кода.

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

Ответ 3

Мы также использовали TryUpdateModel, чтобы избежать магии привязки модели до того, как было вызвано действие; вместо этого мы взяли HttpFormCollection как наш параметр и назвали TryUpdateModel внутри метода. Чистое логическое значение, возвращаемое из этого разрешенного потока управления, передается методу "Успех" или "Сбой" для действия. например.

public ActionResult Save(HttpFormCollection formCollection)
{
  var saveModel = new SaveModel(); // or from a Factory etc
  var validModel = TryUpdateModel(_saveModel, formCollection); // order may be incorrect
  return validModel ? Save(saveModel) : InvalidSaveModel(saveModel);
}

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