El error significa que está navegando a una vista cuyo modelo se declara como typeof Foo(al usar @model Foo), pero en realidad le pasó un modelo que es typeof Bar(tenga en cuenta que el término diccionario se usa porque un modelo se pasa a la vista a través de a ViewDataDictionary) .
El error puede deberse a
Pasar el modelo incorrecto de un método de controlador a una vista (o vista parcial)
Los ejemplos comunes incluyen el uso de una consulta que crea un objeto anónimo (o colección de objetos anónimos) y pasarlo a la vista
var model = db.Foos.Select(x => new
{
ID = x.ID,
Name = x.Name
};
return View(model);
o pasar una colección de objetos a una vista que espera un solo objeto
var model = db.Foos.Where(x => x.ID == id);
return View(model);
El error se puede identificar fácilmente en tiempo de compilación declarando explícitamente el tipo de modelo en el controlador para que coincida con el modelo en la vista en lugar de usar var.
Pasar el modelo incorrecto de una vista a una vista parcial
Dado el siguiente modelo
public class Foo
{
public Bar MyBar { get; set; }
}
y una vista principal declarada con @model Fooy una vista parcial declarada con @model Bar, luego
Foo model = db.Foos.Where(x => x.ID == id).Include(x => x.Bar).FirstOrDefault();
return View(model);
devolverá el modelo correcto a la vista principal. Sin embargo, se lanzará la excepción si la vista incluye
@Html.Partial("_Bar")
De forma predeterminada, el modelo que se pasa a la vista parcial es el modelo declarado en la vista principal y debe usar
@Html.Partial("_Bar", Model.MyBar)
para pasar la instancia de Bara la vista parcial. Tenga en cuenta también que si el valor de MyBares null(no se ha inicializado), de forma predeterminada se Foopasará al parcial, en cuyo caso, debe ser
@Html.Partial("_Bar", new Bar())
Declarar un modelo en un diseño
Si un archivo de diseño incluye una declaración de modelo, todas las vistas que usan ese diseño deben declarar el mismo modelo o un modelo que se derive de ese modelo.
Si desea incluir el html para un modelo separado en un Diseño, en el Diseño, use @Html.Action(...)para llamar a un [ChildActionOnly]método, inicializa ese modelo y devuelve una vista parcial para él.
return Viewlugar de,return PartialViewpor lo que es algo para verificar