Я хочу использовать метод 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 в действии, чтобы получить отправленные элементы формы и их значения, в том числетип модели, которую 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());
Когда я отлаживаю связыватель модели и проверяю bindingContext, свойство Model представляетправильный подкласс, но свойство ModelType принадлежит базовому классу.Должен ли я смотреть на изменение ModelType в методе BindModel?Если да, то есть какие-то указатели на то, как это сделать, установщик для ModelType, похоже, стал избыточным.Я также заметил, что SomeDateProperty из подкласса на самом деле находится в свойстве PropertyMetadata .... Кажется, это так близко к поведению, как мне хотелось бы.