我有一个类层次结构,它们都是从基类型派生的,基类型也实现了一个接口。我想要做的是有一个控制器来处理整个层次结构的管理(因为通过控制器公开的动作是相同的)。话虽这么说,我想让视图在其上具有类型特定字段,并且模型绑定器与隐藏字段值绑定。类似的东西:
<input type="text" name="model.DerivedTypeSpecificField" />
<input type="hidden" name="modelType" value="MyDerivedType" />
话虽这么说,asp.net mvc模型绑定器似乎需要他们将要创建的具体类型,因为这个原因我需要为每个派生类型创建一个不同的控制器。
之前是否有人这样做或知道如何操纵模型绑定器以这种方式运行?我可以编写自己的模型绑定器,但是我不想要任何超出目标类型的assign属性和构建数组的基本模型绑定行为。
谢谢!
答案 0 :(得分:3)
不知道它是否有效,但您可以尝试以下方式:
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);
}
}
这只是基本模型绑定器的简单更改。
答案 1 :(得分:2)
在MvcContrib中查看派生类型ModelBinder。这允许您通过'typestamping'进程模拟绑定到派生类型 - 在使用RenderTypedPartial(...)帮助程序时会自动处理。 MvcContrib partials跨部分维护绑定状态,因此Name / Id前缀在深度对象图上得到适当维护。如果您使用其他机制,如模板,那么您需要自己处理类型印刷。这在文档页面中进行了解释。
回到您的问题以及如何使用ModelBinder解析派生类型,您可以在类似于WCF KnownTypeAttribute的机制中使用属性注册派生类型变体,或者您可以在启动时进行注册。无论哪种方式,这些变化都会被记录一次并保留用于性能考虑。
模型绑定器还以不干扰数据注释/验证属性的方式解决了这个问题。它们将在任何其他场景中按预期工作。