代码之家  ›  专栏  ›  技术社区  ›  Sean Chambers

一般使用ASP.NET MVC模型绑定器

  •  2
  • Sean Chambers  · 技术社区  · 14 年前

    我有一个类的层次结构,这些类都是从基类型派生的,并且基类型也实现了一个接口。我想做的是让一个控制器来处理整个层次结构的管理(因为通过控制器公开的操作是相同的)。也就是说,我希望视图上有特定于类型的字段,并且模型绑定器可以绑定到隐藏的字段值。比如:

    <input type="text" name="model.DerivedTypeSpecificField" />
    <input type="hidden" name="modelType" value="MyDerivedType" />
    

    也就是说,ASP.NET MVC模型绑定器似乎需要它们将要创建的具体类型,因此我需要为每个派生类型创建不同的控制器。

    以前有人这样做过吗,或者知道如何操作模型绑定器以这样做吗?我可以编写自己的模型绑定器,但我不希望任何东西超过分配属性和在目标类型上构建数组的基本模型绑定行为。

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  3
  •   LukLed    14 年前

    不知道它是否有效,但您可以尝试如下操作:

    public class MyBinder : DefaultModelBinder
    {
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            bindingContext.ModelType = System.Type.GetType(controllerContext.HttpContext.Request["modelType"]);
    
            return base.BindModel(controllerContext, bindingContext);
        }
    }
    

    这只是对基本模型绑定器的简单更改。

        2
  •  2
  •   S. Hebert    14 年前

    查看mvcontrib中的派生类型modelbinder。这允许您通过“typestamping”过程对派生类型进行建模绑定,该过程在使用rendertypedpartial(…)助手时自动为您处理。MVCContrib部分保持跨部分的绑定状态,以便在深度对象图上正确维护名称/ID前缀。如果您使用其他机制,如模板,那么您将需要自己处理打印。这在文档页面中进行了解释。

    回到您的问题,以及如何使用ModelBinder解决派生类型,您可以在类似于wcf knowntypeattribute的机制中使用属性注册派生类型变体,也可以在启动时进行注册。无论采用哪种方式,这些变化都会注册一次,并出于性能考虑而保留下来。

    模型绑定器还以不干扰数据注释/验证属性的方式解决了这个问题。在任何其他情况下,它们都会像您预期的那样工作。