2013-08-01 24 views
0

动作控制器是否可以接受文字对象。例如,我有几个视图,我想将各种模型发布到单个控制器,然后可以确定传入的模型对象以进行进一步处理。作为动作控制器的参数的对象?

型号样品:

public class Model1 
{ 
    // properties, etc. 
} 

public class Model2 
{ 
    // properties, etc. 
} 

public class Model3 
{ 
    // properties, etc. 
} 

控制器样品:

[HttpPost] 
public ActionResult ProcessModel(Object anyModel) 
{ 
    // determine the model 
    if((anyModel as Model1) != null) 
    { 
    var model1 = anyModel as Model1; 
    // continue with code 
    } 
    else if((anyModel as Model2) != null) 
    { 
    var model2 = anyModel as Model2; 
    // continue with code 
    } 
    // continue with model check, etc.  
} 

我试过,但我的控制器不出现我的对象参数留空是捡模型。这可能吗?

回答

6

有一个quick read about how model binding works ...模型绑定(这需要无论是张贴到你的行动,并把它变成了anyModel参数使用参数的类型来决定该怎么做。

由于类型为Object它不能做任何事情。

我的猜测(取决于你想要什么来实现)是,你可以有几个动作重载每个作为参数,然后调用通用代码不同类型的模型。

[HttpPost] 
public ActionResult ProcessModel(Model1 anyModel){} 

[HttpPost] 
public ActionResult ProcessModel(Model2 anyModel){} 

[HttpPost] 
public ActionResult ProcessModel(Model3 anyModel){} 

这表示有一个动作需要很多不同的模型是有点奇怪的。你有更好的机会做别的事情。

你的问题,如果你说你想实现

+2

我不认为你可以有多个具有相同名称的动作(不管参数)。 – zimdanen

+3

参数必须是不同的类型。 http://csharpindepth.com/Articles/General/Overloading.aspx –

+1

虽然只是重新阅读你的评论(可能是我睡觉的时间)@zimdanen - yep ...虽然你可以肯定有重载方式和Actions *应该*只是方法我从来没有真正做到这一点,所以不知道如果MVC或模型绑定将barf –

2

Asp.NET ModelBinder的不能这样绑定一般对象的默认什么可能收集更好的答案。您应该看看这里了解DefaultModelBinder将如何在服务器中构建模型:Understanding ASP.NET MVC Model Binding

鉴于您的表单有很多模型,您应该将它们封装到ViewModel中以执行此类操作。

视图模型应该是这样的:

public class MyViewModel 
{ 
    public Model1 Model1 {get; set;} 
    public Model1 Model2 {get; set;} 
    public Model1 Model3 {get; set;} 
} 

而且控制器:

[HttpPost] 
public ActionResult ProcessModel(MyViewModel myViewModel) 
{ 
    // determine the model 
    if(myViewModel.Model1 != null) 
    { 
    // continue with code 
    } 
    else if(myViewModel.Model2 != null) 
    { 
    // continue with code 
    } 
    // continue with model check, etc.  
} 
0

最近我面临着同样的问题,如下解决它:

第1步:来自javascript传递2参数:

首先,将模型名称作为用于识别哪个模型的字符串来传递

第二,从javascript传递数据使用JSON.stringify(data)。您的数据可能来自Model1, Model2 , Model3等。

第二步:在你的控制器:

[HttpPost] 
public ActionResult ProcessModel(string modelName, string anyModel) 
{ 
    switch(modelName) { 
     case "Model1": 
      var modelValue= JsonDeserialize<Model1>(anyModel); 
       // do something 
      break; 
    case "Model2": 
      var modelValue= JsonDeserialize<Model2>(anyModel); 
      // do something 
      break; 
    } 
} 

你需要像下面的方法之一:

public T JsonDeserialize<T>(string jsonModel){ 
return JsonConvert.DeserializeObject<T>(jsonModel, jsonSettings); 
} 

JsonConvert需要命名空间 “Newtonsoft.Json”。

您还需要声明jsonSettings如下

  JsonSerializerSettings jsonSettings= new JsonSerializerSettings 
    { 
     TypeNameHandling = TypeNameHandling.All, 
     DefaultValueHandling = DefaultValueHandling.Ignore 
    }; 

该解决方案是一种变通方法。还有一个解决方案。你也可以检查: How can I make a Controller Action take a dynamic parameter?

希望这会有所帮助。

相关问题