Я хочу использовать метод UpdateModel для подкласса, который извлекается во время выполнения, было бы здорово, если бы кто-нибудь мог пролить свет на то, делаю ли я его полный хэш и / или нет ли то, что я пытаюсь сделать возможно.
Я использую универсальное действие для управления проверкой нескольких частичных представлений; Я пытаюсь уйти от определенного действия для частичного просмотра.
Каждое частичное представление имеет уникальную модель, производную от базовой модели:
public class ModelA : ModelBase{
[Required]
public string SomeStringProperty{get;set;}
...
}
public class ModelB : ModelBase{
[Required]
public DateTime? SomeDateProperty{get;set;}
...
}
public class ModelBase{
public Guid InstanceId{get;set;}
}
Я использую FormCollection в Action, чтобы получить отправленные элементы формы и их значения, включая тип модели, которую View должен использовать для проверки своего запроса. Не обращайте внимания на последствия этого для безопасности в этом примере, я знаю о них, и это только внутреннее подтверждение концепции
[HttpPost]
public ActionResult ChangeCaseState(int id, FormCollection formCollection)
{
Guid instanceId = new Guid(formCollection["instanceId"]);
string modelType = formCollection["modelType"];
//Return a specific Model class based on the event/modelType
var args = GetStateModelClass(modelType, instanceId);
try
{
UpdateModel(args);
if(Model.IsValid){
...
}
catch (Exception)
{
return View("~/Views/Shared/StateForms/" + modelType + ".ascx", args);
}...
А вот код, который я использую для возврата подкласса на основе modelType, переданного контроллеру.
private static ModelBase StateModelClassFactory(string stateModelTypeName, Guid instanceId)
{
switch (stateModelTypeName)
{
case "modelTypeA":
return new ModelA(workflowInstanceId);
case "modelTypeB":
return new ModelB(workflowInstanceId);
...
}
Поскольку тип возвращаемого значения метода StateModelClassFactory относится к базовому классу, хотя я фактически возвращаю подкласс, привязка модели, используемая методом UpdateModel, привязывается только к значениям в базовом классе.
Есть идеи, как я могу решить эту проблему?
ОБНОВЛЕНИЕ:
Я создал связыватель модели клиента:
public class CustomModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
И назначил новую привязку модели правильному базовому классу, чтобы узнать, что происходит под капотом:
ModelBinders.Binders.Add(typeof(ModelBase), new CaseController.CustomModelBinder());
Когда я отлаживаю связыватель модели и проверяю контекст привязки, свойство Model представляет правильный подкласс, но свойство ModelType является свойством базового класса. Стоит ли искать изменение ModelType в методе BindModel? Если да, то какие-либо указатели на то, как это сделать, установщик в ModelType, похоже, был сделан избыточным. Я также заметил, что SomeDateProperty из подкласса фактически находится в свойстве PropertyMetadata .... Кажется, так близко к тому, чтобы вести себя так, как мне хотелось бы.