传入字典的模型项是types..但是这个字典需要一个types的模型项

这个问题和社区维基答案已被添加,以帮助closures这个meta post中讨论的许多未解决的问题。


我有一些代码,当它执行时,它会抛出一个exception,说:

传入字典的模型项目是Bartypes的,但是这个字典需要一个Footypes的模型项目

这是什么意思,我该如何解决?

这个错误意味着你正在浏览一个模型被声明为typeof Foo的视图(通过使用@model Foo ),但是你实际上已经传递了一个typeof Bar的模型(注意术语词典被使用是因为模型被传递给通过ViewDataDictionary查看)。

错误可能是由于

将错误的模型从控制器方法传递到视图(或部分视图)

常见示例包括使用创build匿名对象(或匿名对象的集合)并将其传递给视图的查询

 var model = db.Foos.Select(x => new { ID = x.ID, Name = x.Name }; return View(model); // passes an anonymous object to a view declared with @model Foo 

或将一组对象传递给期望单个对象的视图

 var model = db.Foos.Where(x => x.ID == id); return View(model); // passes IEnumerable<Foo> to a view declared with @model Foo 

通过在控制器中显式声明模型types以匹配视图中的模型而不是使用var可以在编译时容易地识别错误。

将错误的模型从视图传递到局部视图

给定以下模型

 public class Foo { public Bar MyBar { get; set; } } 

并使用@model Foo声明主视图,然后使用@model Bar声明局部视图

 Foo model = db.Foos.Where(x => x.ID == id).Include(x => x.Bar).FirstOrDefault(); return View(model); 

将正确的模型返回到主视图。 但是,如果视图包含,则会抛出exception

 @Html.Partial("_Bar") // or @{ Html.RenderPartial("_Bar"); } 

默认情况下,传递给部分视图的模型是在主视图中声明的模型,您需要使用

 @Html.Partial("_Bar", Model.MyBar) // or @{ Html.RenderPartial("_Bar", Model.MyBar); } 

Bar的实例传递给局部视图。 还要注意的是,如果MyBar值为null (尚未初始化),那么默认情况下Foo将被传递给partial,在这种情况下,它需要

 @Html.Partial("_Bar", new Bar()) 

在布局中声明模型

如果布局文件包含模型声明,则使用该布局的所有视图必须声明相同的模型或从该模型派生的模型。

如果要在布局中包含单独模型的HTML,那么在布局中,使用@Html.Action(...)调用[ChildActionOnly]方法将初始化该模型并返回其部分视图。