错误意味着您正在导航到一个视图,其模型声明为 typeof Foo(通过使用 @model Foo),但您实际上传递给它的模型是 typeof Bar(注意术语 dictionary 之所以被使用,是因为模型是通过 ViewDataDictionary 传递给视图的。
错误可能是由于
将错误的模型从控制器方法传递到视图(或部分视图)
常见示例包括使用创建匿名对象(或匿名对象集合)的查询并将其传递给视图
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
通过在控制器中显式声明模型类型以匹配视图中的模型而不是使用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);
会将正确的模型返回到主视图。但是,如果视图包含,则会引发异常
@Html.Partial("_Bar") // or @{ Html.RenderPartial("_Bar"); }
默认情况下,传递给局部视图的模型是主视图中声明的模型,你需要使用
@Html.Partial("_Bar", Model.MyBar) // or @{ Html.RenderPartial("_Bar", Model.MyBar); }
将Bar 的实例传递给局部视图。另请注意,如果MyBar 的值为null(尚未初始化),则默认情况下Foo 将传递给部分,在这种情况下,它需要是
@Html.Partial("_Bar", new Bar())
在布局中声明模型
如果布局文件包含模型声明,则使用该布局的所有视图都必须声明相同的模型,或从该模型派生的模型。
如果您想在 Layout 中包含单独模型的 html,请在 Layout 中使用 @Html.Action(...) 调用 [ChildActionOnly] 方法初始化该模型并为其返回部分视图。