繁体   English   中英

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

[英]Object as a parameter for an action controller?

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

模型样本:

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

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

快速了解模型绑定的工作原理 ... 模型绑定器(它将任何内容发布到Action并将其转换为anyModel参数)使用参数的类型来确定要执行的操作。

由于类型是Object因此它无法执行任何操作。

我的猜测(取决于您要实现的目标)是,您可以有多个Action重载,每个重载都使用不同类型的Model作为参数,然后调用通用代码。

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

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

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

那就是说采取一个动作需要很多不同的模型有点奇怪。 您很有可能要做其他事情。

如果您说出自己要实现的目标,那么您的问题可能会得到更好的答案

默认的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.       
}

最近,我遇到了相同的问题,并通过以下方法解决了该问题:

步骤1:从javascript pass 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
    };

此解决方案是一种解决方法。 还有另一种解决方案。 您还可以检查以下内容: 如何使Controller Action接受动态参数?

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM