对象作为动作控制器的参数
本文关键字:参数 控制器 对象 | 更新日期: 2023-09-27 18:25:48
动作控制器是否可以接受文字对象。例如,我有几个视图,我想在其中将各种模型从发布到单个控制器,然后该控制器可以确定传入的模型对象以进行进一步处理。
型号示例:
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传递2参数:
首先,将型号名称作为字符串传递,以识别哪个型号即将
其次,使用JSON.stringfy(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
};
这种解决方案是一种变通方法。还有一个解决方案。您也可以检查:如何使控制器操作采用动态参数?
希望这能有所帮助。