0

Мой вопрос в основном такой же, как в ситуации, представленной в this stack overflow question, где я нахожусь в желании загрузить существующую действующую версию модели из БД и обновить часть его, поскольку определенный поднабор полей отображается в моей веб-форме.Лучший способ частичного обновления модели ASP.NET MVC (форма представления пользователя «merge» с моделью)

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

Если бы я мог гарантировать это, то внутри установщика моего свойства идентификатора ViewModel я мог бы вызвать «нагрузку», так что объект изначально заполняется из БД (или службы WCF .. или файла Xml .. или другого репозитория выбора), а затем остальные свойства, отправленные из сообщения FORM, аккуратно сливаются в объект, поскольку MVC завершает процесс привязки модели.

Тогда мой метод IValidatableObject.Validate логика красиво сказать мне, если полученный объект остается в силе .. и так далее, и так далее ..

Это только мне кажется, что, чтобы писать сантехнику, где у меня есть два экземпляра модели (knownValidDomainModelInstanceFromStorage, publishedPartialViewModelInstanceFromForm), а затем вручную сопоставление требуемых свойств - это повторение того, что действительно обрабатывается MVC ... если бы я мог контролировать только порядок привязки идентификатора.


РЕДАКТИРОВАТЬ - Я обнаружил, что для привязки к объекту можно управлять с помощью специального связующего. Очень легко. Прочтите ответ, который я разместил ниже. По-прежнему приветствую ваши отзывы или замечания.

ответ

0

Хорошо, после изучения того, как настроить связующее устройство по умолчанию, я думаю, что этот бит кода может сделать трюк сортировки свойств и даст мне желаемый порядок привязки каждый раз. В принципе, я позволяю мне сначала привязать свойства идентификации (и, таким образом, позволить мне запускать мою модель View Model «load»), позволяя остальной части процесса привязки модели функционировать в основном как слияние!

''' <summary> 
''' A derivative of the DefaultModelBinder that ensures that desired properties are put first in the binding order. 
''' </summary> 
''' <remarks> 
''' When view models can reliably expect a bind of their key identity properties first, they can then be designed trigger a load action 
''' from their repository. This allows the remainder of the binding process to function as property merge. 
''' </remarks> 
Public Class BindIdFirstModelBinder 
     Inherits DefaultModelBinder 

    Private commonIdPropertyNames As String() = {"Id"} 
    Private sortedPropertyCollection As ComponentModel.PropertyDescriptorCollection 

    Public Sub New() 
     MyBase.New() 
    End Sub 

    ''' <summary> 
    ''' Use this constructor to declare specific properties to look for and move to top of binding order. 
    ''' </summary> 
    ''' <param name="propertyNames"></param> 
    ''' <remarks></remarks> 
    Public Sub New(propertyNames As String()) 
     MyBase.New() 
     commonIdPropertyNames = propertyNames 
    End Sub 

    Protected Overrides Function GetModelProperties(controllerContext As ControllerContext, bindingContext As ModelBindingContext) As ComponentModel.PropertyDescriptorCollection 
     Dim rawCollection = MyBase.GetModelProperties(controllerContext, bindingContext) 

     Me.sortedPropertyCollection = rawCollection.Sort(commonIdPropertyNames) 

     Return sortedPropertyCollection 
    End Function 

End Class 

Тогда я могу зарегистрировать это в месте моего DefaultModelBinder, и поставлять наиболее распространенные имена свойств, которые я хотел бы иметь «поплыл» к началу процесса ModelBinding ...

Sub Application_Start() 

      RouteConfig.RegisterRoutes(RouteTable.Routes) 
      BundleConfig.RegisterBundles(BundleTable.Bundles) 
      ' etc... other standard config stuff omitted... 
      ' override default model binder: 
      ModelBinders.Binders.DefaultBinder = New BindIdFirstModelBinder({"Id", "WorkOrderId", "CustomerId"}) 
    End Sub 
+0

Я начал использовать эту концепцию, и, похоже, она работает до сих пор. Нужно было немного поработать над установщиком идентификатора ViewModel, чтобы он загружался так, как я хотел, не рекурсивный сам по себе .. но .. после этого все это похоже на оснастку. Нет более частичных моделей или частичного картирования кошмаров. Надеясь, что кто-то найдет его полезным, как у меня. – bkwdesign