Этот вопрос и ответ вики сообщества были добавлены, чтобы помочь закрыть множество неотвеченных вопросов, как описано в этом мета-сообщении .
У меня есть код, и когда он выполняется, выдает исключение:
Элемент модели, переданный в словарь, имеет тип Bar, но для этого словаря требуется элемент модели типа Foo.
Что это значит и как это исправить?
c#
asp.net-mvc
Сообщество
источник
источник
return View
вместоreturn PartialView
, чтобы просто проверитьОтветы:
Ошибка означает, что вы переходите к представлению, модель которого объявлена как typeof
Foo
(с помощью@model Foo
), но на самом деле вы передали ему модель typeofBar
(обратите внимание, что словарь терминов используется, потому что модель передается в представление через aViewDataDictionary
) .Ошибка может быть вызвана
Передача неправильной модели из метода контроллера в представление (или частичное представление)
Общие примеры включают использование запроса, который создает анонимный объект (или коллекцию анонимных объектов) и передает его в представление
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())
Объявление модели в макете
Если файл макета включает объявление модели, то все представления, использующие этот макет, должны объявлять одну и ту же модель или модель, производную от этой модели.
Если вы хотите включить html для отдельной модели в макет, то в макете используйте
@Html.Action(...)
для вызова[ChildActionOnly]
метода, инициализирует эту модель и возвращает для нее частичное представление.источник
Model.MyBar
равно null, вы можете сделать это:@Html.Partial("_Bar", Model.MyBar, new System.Web.Mvc.ViewDataDictionary())
Источник: https://stackoverflow.com/a/713921/4888725На этот вопрос уже есть отличный ответ, но я столкнулся с той же ошибкой в другом сценарии: отображение a
List
в EditorTemplate .У меня такая модель:
public class Foo { public string FooName { get; set; } public List<Bar> Bars { get; set; } } public class Bar { public string BarName { get; set; } }
И это мой основной взгляд :
@model Foo @Html.TextBoxFor(m => m.Name, new { @class = "form-control" }) @Html.EditorFor(m => m.Bars)
А это мой шаблон Bar EditorTemplate ( Bar.cshtml )
@model List<Bar> <div class="some-style"> @foreach (var item in Model) { <label>@item.BarName</label> } </div>
И я получил такую ошибку:
Причина этой ошибки в том,
EditorFor
чтоList
для вас уже выполняется итерация , поэтому, если вы передадите ему коллекцию, он отобразит шаблон редактора один раз для каждого элемента в коллекции.Вот как я исправил эту проблему:
Перенес стили за пределы шаблона редактора и в главное представление :
@model Foo @Html.TextBoxFor(m => m.Name, new { @class = "form-control" }) <div class="some-style"> @Html.EditorFor(m => m.Bars) </div>
И изменил EditorTemplate ( Bar.cshtml ) на это:
источник
Обратите внимание, есть ли у вида требуемая модель:
Посмотреть
@model IEnumerable<WFAccess.Models.ViewModels.SiteViewModel> <div class="row"> <table class="table table-striped table-hover table-width-custom"> <thead> <tr> ....
Контроллер
[HttpGet] public ActionResult ListItems() { SiteStore site = new SiteStore(); site.GetSites(); IEnumerable<SiteViewModel> sites = site.SitesList.Select(s => new SiteViewModel { Id = s.Id, Type = s.Type }); return PartialView("_ListItems", sites); }
В моем случае я использую частичное представление, но работаю в обычных представлениях
источник