Я работаю над техникой, в которой я создаю пользовательскую производную DefaultModelBinder.Он работает в том же духе, что и подход с использованием белого списка, опубликованный @AndrewCooper, но с изюминкой.
В моем подходе я придерживаюсь одной большой сигнальной ViewModel, которая может иметь множество частичных просмотров, пытающихся обновитьЭто.Белый список, в моем случае, - это критические поля идентификации объекта , необходимые для информирования ViewModel о том, как он может автоматически загружаться из репозитория, поэтому ожидается, что частичные представления содержат ТОЛЬКО поля, которые онизаботиться о и достаточном количестве скрытых полей для уточнения идентичности объекта , если это не сразу видно из маршрута или чего-либо еще.
Таким образом, во время фазы связывания модели POST идентичностьполя привязываются первыми (таким образом, «загрузка» запускается для немедленного обновления модели из БД), а после завершения процесса связывания вы фактически «слили» объект, извлеченный из БД, с данными, предоставленными пользователем... и вдобавок к этому (при условии, что вы придерживались соглашений MVC) теперь он прошел проверку.
Это позволяет мне придерживаться простого метода контроллера из учебника .. что-то вроде ..
Public Function Edit(id As Integer, workOrder as MergedWorkOrderModel) As ActionResult
If ModelState.IsValid Then
/* save model, send success messaging into ViewBag, etc */
workOrder.Save("ServiceUrl")
workOrder.Load("ServiceUrl")
ViewBag.SuccessMessage = String.Format("Order {0} saved successfully!", workOrder.Id)
Return View(workOrder)
Else
/* return user model to fix errors */
ViewBag.ErrorMessage = String.Format("Order {0} did not save.", workOrder.Id)
Return View(workOrder)
End If
End Function
Теоретически, я мог бы указать все свои различные взгляды на этот же метод - потому что это не важно, гдеПользовательские данные получены из .. все они объединяются с последними из БД, проверяются и сохраняются одинаково.
Больше информации на моем посте StackOverflow