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.       
}

我试过了,但我的控制器似乎没有拾取模型,因为我的对象参数仍然是空的。这可能吗?

4

3 回答 3

6

快速阅读模型绑定的工作原理......模型绑定器(它获取发布到您的 Action 的任何内容并将其转换为 anyModel 参数)使用参数的类型来确定要做什么。

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

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

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

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

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

也就是说,有一个动作需要许多不同的模型有点奇怪。很有可能你最好做点别的事情。

如果您说出您要达到的目标,您的问题可能会得到更好的答案

于 2013-08-01T21:50:18.580 回答
2

默认 Asp.NET ModelBinder 无法以这种方式绑定泛型对象。您应该在这里查看以了解如何通过 DefaultModelBinder 在服务器中重新构建模型:了解 ASP.NET MVC 模型绑定

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

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.       
}
于 2013-08-01T21:55:54.050 回答
0

最近我遇到了同样的问题并解决如下:

第 1 步:从 javascript 传递 2 参数:

首先,将模型名称作为字符串传递,以识别即将到来的模型

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

第2步:在您的控制器中:

[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
    };

此解决方案是一种解决方法。还有一种解决方案。您还可以检查: 如何使控制器动作采用动态参数?

希望这可以帮助。

于 2015-07-29T04:40:36.497 回答