Я устал от создания маленьких ViewModels небольшого назначения, которые касались только части моей доменной модели шириной в милю.
Таким образом, я разработал свой собственный метод решения этой проблемы. Моя ViewModel - это typeOf DomainModel, и я использую пользовательскую связующую модель , чтобы гарантировать, что ее свойства идентичности загружаются первыми - после того как идентичность установлена - он запускает DomainModel.Load, а оставшаяся часть действия привязки по существу выполняет 'сливаться'.
Опять же, когда моя ViewModel привязана (например, к форме POST), после того, как установлены обязательные поля, содержащие идентификатор, - он немедленно загружает модель домена из базы данных. Мне просто нужно было придумать замену для DefaultModelBinder. Моя пользовательская привязка модели , размещенная здесь в StackOverflow , позволяет вам контролировать порядок привязки свойств.
Как только я могу гарантировать, что свойства идентичности связаны, (внутренняя часть моей модели представления прослушивает завершение установки идентификаторов), я запускаю загрузку моей доменной модели, так как остальные свойства связаны, они перезаписываются, т.е. «слияние» с моделью загруженного домена.
В принципе, у меня могут быть все мои различные виды бритвы, независимо от того, предоставляют ли они 5 полей формы или 50 полей модели ... все подчиняются действию контроллера, которое выглядит следующим образом (предоставлено, я все еще делаю отдельные действия, где это необходимо сделать соответствующие пользовательские деловые штучки .. но дело в том, что мои действия контроллера сосредоточены и лаконичны)
<HttpPost()>
<Authorize(Roles:="MYCOMPANY\activeDirRoleForEditing")>
Function Edit(<Http.FromBody()> ByVal mergedModel As OrderModel) As ActionResult
'notice: NO loading logic here - it already happened during model binding
'just do the right thing based upon resulting model state
If Me.ModelState.IsValid Then
mergedModel.SaveAndReload("MyServiceWebConfigKey")
ViewBag.SuccessMessage = String.Format("You have successfully edited the order {0}", mergedModel.Id)
Return View("Edit", mergedModel)
Else
ViewBag.ErrorText = String.Format("Order {0} not saved. Check for errors and correct.", mergedModel.Id)
Return View("Edit", mergedModel)
End If
End Function