C# 对象作为动作控制器的参数?

C# 对象作为动作控制器的参数?,c#,asp.net-mvc,C#,Asp.net Mvc,动作控制器是否可以接受文字对象。例如,我有几个视图,我想在其中将各种模型从发布到单个控制器,然后可以确定传入的模型对象以进行进一步处理 模型样本: public class Model1 { // properties, etc. } public class Model2 { // properties, etc. } public class Model3 { // properties, etc. } 控制器示例: [HttpPost] public ActionR

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

模型样本:

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.       
}
我已经尝试过了,但是我的控制器似乎没有拾取模型,因为我的对象参数仍然为空。这可能吗?

有一个。。。模型绑定器(modelbinder,它获取发布到动作中的任何内容,并将其转换为anyModel参数)使用参数的类型来确定要执行的操作

因为类型是
Object
,所以它不能做任何事情

我的猜测(取决于您试图实现的内容)是,您可以有几个操作重载,每个重载使用不同类型的模型作为参数,然后调用公共代码

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

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

[HttpPost]
public ActionResult ProcessModel(Model3 anyModel){}
也就是说,有一个动作需要很多不同的模型,这有点奇怪。你很有可能做其他的事情会更好


如果您说出您试图实现的目标,您的问题可能会得到更好的答案默认Asp.NET ModelBinder无法以这种方式绑定泛型对象。您应该查看此处以了解DefaultModelBinder将如何在服务器中重新构建模型:

鉴于表单有许多模型,您应该将它们封装到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.       
}
[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;
    }
}

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

步骤1:来自javascript pass 2参数:

首先,将模型名作为字符串传递,以标识要使用的模型

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

步骤2:在控制器中:

[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.       
}
[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;
    }
}
此解决方案是一种变通方法。还有一种解决方案。您也可以检查:


希望这能有所帮助。

我不认为您可以使用相同的名称执行多个操作(无论参数如何)。参数必须是不同的类型。尽管刚刚重新阅读了您的评论(可能是我睡觉的时候了)@zimdanen-是的……虽然你可以用这种方式重载方法,而操作应该是方法,但我从来没有真正这么做过,所以不知道MVC或模型绑定是否会呕吐。现在,MVC会呕吐,但你可以在每个操作中添加一个属性来区分它们。也就是说,我确实认为最好做些其他事情:)