Помилка означає, що ви переходите до подання, модель якого оголошена як 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
тому це просто потрібно перевірити