C# 一般使用asp.net mvc模型绑定器

C# 一般使用asp.net mvc模型绑定器,c#,asp.net-mvc,binding,model,C#,Asp.net Mvc,Binding,Model,我有一个类的层次结构,所有这些类都派生自一个基类型,并且基类型还实现了一个接口。我想要做的是有一个控制器来处理整个层次结构的管理(因为通过控制器公开的操作是相同的)。也就是说,我希望视图上有特定于类型的字段,并且模型绑定器根据隐藏字段值进行绑定。比如: <input type="text" name="model.DerivedTypeSpecificField" /> <input type="hidden" name="modelType" value="MyDerived

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

<input type="text" name="model.DerivedTypeSpecificField" />
<input type="hidden" name="modelType" value="MyDerivedType" />
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);
    }
}

也就是说,asp.net mvc模型绑定器似乎需要它们将要创建的具体类型,因为这个原因,我需要为每个派生类型创建不同的控制器

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


谢谢

不知道它是否有效,但您可以尝试以下方法:

<input type="text" name="model.DerivedTypeSpecificField" />
<input type="hidden" name="modelType" value="MyDerivedType" />
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);
    }
}

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

查看MvcContrib中的派生类型ModelBinder。这允许您通过“typestamping”过程建模绑定到派生类型,这是在使用RenderTypedPartial(…)帮助程序时自动处理的。MvcContrib部分保持跨部分的绑定状态,以便在深层对象图上正确维护名称/Id前缀。如果您使用其他机制,如模板,那么您需要自己处理类型标记。文档页面对此进行了解释

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


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

我知道了。除了从ValueProviders数组中获取模型类型之外,我的解决方案与您的几乎相同。谢谢