2012-03-07 111 views
2

我正在使用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); 
} 

我可能会有很多不同的视图模型,因此针对每种类型的不同操作实际上是不可能的。

回答

4

你需要编写自定义的模型绑定这个工作:

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

+1的确很有意思。 – 2012-03-07 17:09:42

相关问题