2015-11-04 50 views
-1

我有几百个表单,其中@model Dictionary<string,CustomType_i> CustomType_i是表单特定模型!如何以编程方式触发或控制模型绑定

而不是写一个行动foreach窗体,我试图将它们提交给一个控制器的行动。这里是我的尝试:

public ActionResult ProcessForm(string formName, Dictionary<string,dynamic> mymodel){ 
    swich(formName){ 
    case "Customer": 
    ///want to tell mvc to bind to Dictionary<string,Customer> 
    break; 
    case "Business": 
    ///want to tell mvc to bind to Dictionary<string,Business> 
    break; 
    } 

}

我曾尝试使用.ToDictionary(kv => kv.Key, kv => kv.Value as Customer)但它仍然是零,这或许意味着没有密钥的类型客户的myModelDictionary<string,Customer>转换! 当我将dynamic更改为Customer时,它适用于客户表单的情况,而不是其他表单的情况!

如何触发模型绑定到指定的类型?

+0

的'DefaultModelBinder'结合模型之前执行在方法的任何代码。它太晚了,绑定已经失败,因为它不能绑定到'dynamic'。虽然你可以编写你自己的模型绑定器,但它比每个视图有一个'ActionResult'方法的代码要多得多。 –

回答

0

您可以编写自己的ModelBinder,扩展IModelBinder接口或DefaultModelBinder。

基本上你必须重写BindModel方法。

我想你应该写这样的事情:

public class MyCustomBinder : DefaultModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, 
          ModelBindingContext bindingContext) 
    { 
     HttpRequestBase request = controllerContext.HttpContext.Request; 

     if(string.IsNullOrWhiteSpaces(request.Form.Get("formName"))) 
     { 
      switch(formName){ 
       case "Customer": 
       /// Instantiate via reflection a Dictionary<string,Customer> 
       ... 
       // Return the object 
       break; 
       case "Business": 
       ///Instantiate via reflection a Dictionary<string,Business> 
       ... 
       // Return the object 
       break; 
      } 
     } 
     else 
     { 
      return base.BindModel(controllerContext, bindingContext); 
     } 
    } 
} 
相关问题