我希望将 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;}
}
我在 Action 上使用 FormCollection 来获取提交的表单元素及其值,这包括视图应该用来验证其请求的模型类型。忽略此示例的安全隐患,我知道它们,这是内部唯一的概念证明
[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);
}...
这是我用来根据传递给控制器的模型类型返回子类的代码。
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 属性是基类的属性。我应该考虑在 BindModel 方法中更改 ModelType 吗?如果是关于如何执行此操作的任何指针,则 ModelType 上的设置器似乎已变得多余。我还注意到子类中的 SomeDateProperty 实际上在 PropertyMetadata 属性中......似乎非常接近我想要的行为。