我的视图中需要2 models
。但由于我们只能添加1个视图,因此采用了以下方法;
@model Tuple<My.Models.Mod1,My.Models.Mod2>
@Html.DropDownListFor(m => m.Item2.humanKind,Model.Item2.allHuman)
@Html.TextBoxFor(m => m.Item1.food)
但是,我最终得到的是以下错误;
The model item passed into the dictionary is of type 'My.Models.Mod2', but this dictionary requires a model item of type 'System.Tuple`2[My.Models.Mod1,My.Models.Mod2]'.
这是什么,我该如何解决这个问题?
更新
public ActionResult Index()
{
var model2 = new Mod2 { allHuman = allHumans() };
var model1 = new Mod1(); // JUST NOW I ADDED THIS, BUT IT DOESn't WORK
return View(model1,model2);
}
答案 0 :(得分:1)
有问题的视图是从控制器操作调用的,该操作只传递My.Models.Mod2
而不是Tuple<My.Models.Mod1,My.Models.Mod2>
。
仔细检查调用此视图的特定控制器操作。
<强>更新强>
您的控制器代码
return View(model1,model2);
应该是
return View(new Tuple<My.Models.Mod1,My.Models.Mod2>(model1, model2>);
您将model1和model2作为单独的参数传递,而不是作为元组传递。
答案 1 :(得分:1)
每个视图只能有一个模型。你需要像Ufuk建议的那样实例化元组。
但是我建议创建一个将其他模型作为属性的新模型。
答案 2 :(得分:1)
构建包含以下内容的视图模型:
Public class CompositeViewModel{
Public Mod1 mod1 {get;set;}
Public Mod2 mod2 {get;set}
}
然后构造并传递CompositeViewModel以进行查看。设置视图以将CompositeViewModel用作模型@model CompositeViewModel
使用元组不会轻易地扩展或更改您正在执行的操作。
甚至可能看起来你有一个拥有数据的ViewModel,然后是一些关联的IEnumerable<SelectListItem>
。如果是这种情况,那么将ViewModel命名为CreateAnimalTypeViewModel,其中包含创建它所需的所有属性,然后有各种选择列表。
如果您需要从某些内容映射到ViewModel,例如如果您正在编辑现有项目,则可以使用AutoMapper。
答案 3 :(得分:0)
在将元组实例发送到视图之前,您不会创建该元组实例。
public ActionResult Index()
{
var model2 = new Mod2 { allHuman = allHumans() };
var model1 = new Mod1();
return View(new Tuple<Mod1,Mod2>(model1,model2));
}