Когда и почему вы используете TryUpdateModel в asp.net mvc 2?
Я не могу найти только базовый пример кода, чтобы увидеть, как работает TryUpdateModel? Когда вы его используете и почему?
3 ответа:
вы можете использовать этот метод для обновления модели, которая поддерживает определенный вид через данный контроллер. Например, если у меня есть представление, отображающее объект Foo со строкой свойств, заполненной текстовым полем, я могу вызвать метод Save() на контроллере и вызвать TryUpdateModel, чтобы попытаться обновить Foo.
public class Foo { public string Bar { get; set; } } // ... in the controller public ActionResult Save() { var myFoo = new Foo(); TryUpdateModel(myFoo); }
это будет пытаться обновить модель с заданным значением для бара. Если обновление не проходит проверку (скажем, например, что бар был целым числом и текстовое поле имело текст "привет" в нем) затем TryUpdateModel передаст обновление ViewData ModelState с ошибками проверки, и ваше представление отобразит ошибки проверки.
убедитесь, что вы уделяете пристальное внимание предупреждению безопасности для .NET Framework 4 в документации MSDN:
Безопасность используйте один из [Перегрузка: Система.Сеть.Mvc.Контроллер.TryUpdateModel " 1] методы, которые принимают либо список свойства для включения (белый список) или список свойства для исключения (a черный список.) Если нет явного белого списка или черный список передается, [Перегрузка: Система.Сеть.Mvc.Контроллер.TryUpdateModel`1] метод пытается обновить каждый публичный свойство в модели для которого существует соответствующее значение в запрос. Злонамеренный пользователь может используйте это для обновления свойства, которые вы не собираетесь использовать обеспечивать доступ к.
https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.tryupdatemodel(v=vs. 100).aspx
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()
выдает исключение, если есть ошибка, которая требует немного больше кода.Примечание: Вы можете захотеть используйте одну из перегрузок, которая позволяет ограничьте, какие свойства могут быть обновлены.
мы также использовали
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
для всех наших случаях проверки и, следовательно, проверить действие.