Ошибка означает, что вы переходите к представлению, модель которого объявлена как typeof Foo
(с помощью @model Foo
), но на самом деле вы передали ему модель typeof Bar
(обратите внимание, что словарь терминов используется, потому что модель передается в представление через a ViewDataDictionary
) .
Ошибка может быть вызвана
Передача неправильной модели из метода контроллера в представление (или частичное представление)
Общие примеры включают использование запроса, который создает анонимный объект (или коллекцию анонимных объектов) и передает его в представление
var model = db.Foos.Select(x => new
{
ID = x.ID,
Name = x.Name
};
return View(model);
или передача коллекции объектов в представление, которое ожидает один объект
var model = db.Foos.Where(x => x.ID == id);
return View(model);
Ошибка может быть легко идентифицирована во время компиляции, явно объявив тип модели в контроллере, чтобы соответствовать модели в представлении, а не использовать 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")
По умолчанию модель, переданная в частичное представление, является моделью, объявленной в основном представлении, и вам необходимо использовать
@Html.Partial("_Bar", Model.MyBar)
чтобы передать экземпляр Bar
в частичное представление. Также обратите внимание, что если значение MyBar
равно null
(не было инициализировано), то по умолчанию Foo
будет передано в партиал, и в этом случае оно должно быть
@Html.Partial("_Bar", new Bar())
Объявление модели в макете
Если файл макета включает объявление модели, то все представления, использующие этот макет, должны объявлять одну и ту же модель или модель, производную от этой модели.
Если вы хотите включить html для отдельной модели в макет, то в макете используйте @Html.Action(...)
для вызова [ChildActionOnly]
метода, инициализирует эту модель и возвращает для нее частичное представление.
return View
вместоreturn PartialView
, чтобы просто проверить