Когда и зачем использовать TryUpdateModel в ASP.NET MVC 2?
Не могу найти простого примера кода, чтобы понять, как работает метод TryUpdateModel. Когда его нужно использовать и почему?
2 ответ(ов)
TryUpdateModel()
позволяет вам связывать параметры с вашей моделью внутри действия контроллера. Это полезно, если вы хотите загрузить вашу модель из базы данных и затем обновить её на основе пользовательского ввода, вместо того чтобы получать всю модель только из пользовательского ввода.
public ActionResult Update(int id) {
var service = new ServiceClass();
var record = service.LoadModel(id);
if (!TryUpdateModel(record)) {
// Произошла ошибка при связывании данных
return View();
}
// Всё прошло успешно, теперь сохраним запись обратно в базу данных
service.SaveModel(record);
return View("Success");
}
TryUpdateModel()
действует аналогично UpdateModel()
в этом отношении, но возвращает true
при успешном выполнении и false
, если произошла ошибка. В отличие от UpdateModel()
, который выбрасывает исключение в случае ошибки и требует немного больше кода для обработки.
Обратите внимание: вы можете использовать одну из перегрузок, которая позволяет ограничить, какие свойства могут быть обновлены.
В нашем случае мы также использовали TryUpdateModel
, чтобы избежать "магии" связывания модели до вызова действия. Вместо этого мы принимали HttpFormCollection
в качестве параметра и вызывали TryUpdateModel
внутри метода. Чистое булевое значение, возвращаемое этим методом, позволяло управлять потоком выполнения, направляя его либо к методу успеха, либо к методу неудачи для действия. Например:
public ActionResult Save(HttpFormCollection formCollection)
{
var saveModel = new SaveModel(); // или из Фабрики и т.д.
var validModel = TryUpdateModel(saveModel, formCollection); // порядок может быть неверным
return validModel ? Save(saveModel) : InvalidSaveModel(saveModel);
}
Мы заметили, что создать HttpFormCollection
для всех случаев валидации достаточно просто, и поэтому мы смогли эффективно протестировать действие.
Как создать выпадающий список из enum в ASP.NET MVC?
Как перенаправить всё, кроме Web API, на /index.html
Обмен сессиями между приложениями с использованием службы состояния сессии ASP.NET
Обнаружено потенциально опасное значение Request.Form, полученное от клиента
Таймаут при использовании Linq-to-SQL