asp.net-mvc - MVC UpdateModel 和子类与基类

标签 asp.net-mvc asp.net-3.5 subclassing updatemodel

我正在寻找对在运行时检索的子类使用 UpdateModel 方法,如果有人能够阐明我是否正在对其进行总哈希和/或是否是我的内容,那就太好了我尝试做的事情是可能的。

我正在使用通用操作来控制一堆部分 View 的验证;我试图摆脱对每个部分 View 执行特定操作的情况。

每个部分 View 都有一个派生自基本模型的唯一模型:

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);
        }...

这是我用来根据传递给 Controller ​​的 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 方法使用的模型绑定(bind)器也仅绑定(bind)基类中的值。

关于如何解决这个问题有什么想法吗?

更新:

我创建了一个客户模型绑定(bind)器:

public class CustomModelBinder : DefaultModelBinder
    {
      public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
            {

并将新的模型绑定(bind)器分配给正确的基类,以查看幕后发生的情况:

ModelBinders.Binders.Add(typeof(ModelBase), new CaseController.CustomModelBinder());

当我调试模型绑定(bind)器并检查 BindingContext 时,Model 属性代表正确的子类,但 ModelType 属性是基类的属性。我应该考虑更改 BindModel 方法中的 ModelType 吗?如果有关于如何执行此操作的任何指示,则 ModelType 上的 setter 似乎已变得多余。我还注意到子类中的 SomeDateProperty 实际上位于 PropertyMetadata 属性中......看起来非常接近我想要的行为。

最佳答案

我刚刚遇到了这个特定问题,发现更好的通用方法是将模型转换为动态,同时将其传递给UpdateModel:

[HttpPost]
public ActionResult ChangeCaseState(int id, FormCollection formCollection)
{
    ...try
    {
        UpdateModel((dynamic)args);//!!notice cast to dynamic here
        if(Model.IsValid){
         ...
    }
    catch...

这似乎设置了我的类型的所有可用属性,无论我的变量是否使用基本类型进行了声明。

CodePlex 中针对此问题提交了一个工作项:http://aspnet.codeplex.com/workitem/8277?ProjectName=aspnet

关于asp.net-mvc - MVC UpdateModel 和子类与基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4287227/

相关文章:

asp.net-mvc - ASP.NET MVC Razor 布局 - url 未更新

c# - 在 javascript 中使用 Url.Action

asp.net-mvc - 部署到 azure 时图形丢失

asp.net-mvc - jQuery ajax 方法的简单问题

delphi - Delphi:适当的时间来继承和还原控件吗?

c# - LINQ to SQL 中的内部连接不起作用

javascript - 如何使用jquery在外部div的鼠标悬停时显示内部

css - chrome 不显示 css 图像

java - Java编程实践: stacking enums and enum constructors,和子类化哪个更好?

objective-c - 子类化 UIPanGestureRecognizer 以在识别之前等待条件