创建一个未知类型的对象的实例和TryUpdateModel
问题描述:
我正在使用MVC和我有一个控制器操作,它处理几个不同的视图模型,每个视图模型有验证,我希望控制器检查验证。创建一个未知类型的对象的实例和TryUpdateModel
这是我的控制器操作:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult WizardCaseResult(FormCollection fc)
{
ViewA vm = new ViewA();
TryUpdateModel<ViewA>(vm);
}
如何改变这种代码,以便视图模型的类型可以设置动态是这样的:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult WizardCaseResult(FormCollection fc, string ViewType)
{
ViewType vm = new ViewType();
TryUpdateModel<ViewType>(vm);
}
我可能会有很多不同的视图模型,因此针对每种类型的不同操作实际上是不可能的。
答
你需要编写自定义的模型绑定这个工作:
public class MyModelBinder : DefaultModelBinder
{
protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
{
var typeValue = bindingContext.ValueProvider.GetValue("viewType");
var type = Type.GetType(
(string)typeValue.ConvertTo(typeof(string)),
true
);
var model = Activator.CreateInstance(type);
bindingContext.ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => model, type);
return model;
}
}
然后:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult WizardCaseResult([ModelBinder(typeof(MyModelBinder))]object model)
{
...
}
现在你需要做的就是确保表单发送ViewType
参数将指向您要实例化的视图模型。
哦,你可以对强类型忘记诸如以下处理那些只在运行时已知类型时:
ViewType vm = new ViewType();
TryUpdateModel<ViewType>(vm);
您也可能会发现following answer有帮助的。
+1的确很有意思。 – 2012-03-07 17:09:42