У меня есть строго типизированный частичный вид, который отображается внутри _Layout.cshtml, чтобы он включался в каждую страницу. В рамках этого частичного представления я пытаюсь сделать еще одно частичное представление. Я создал модель представления (ShoutboxView) для использования в качестве модели для родительского представления. При попытке оказать частичный вид ребенка (_ShoutList) в пределах этого, я получаю сообщение об ошибке, что модель, которую я передаю в этой неправильном типе:Оказание строго типизированного частичного представления в другом строго типизированном частичном представлении - некорректная модель, передаваемая в дочерний вид
Модели элемент передается в словарь типа «MvcForumTest .ViewModels.ShoutboxView ', но для этого словаря требуется элемент модели типа «System.Collections.Generic.IEnumerable`1 [MvcForumTest.Models.Shout]».
Пожалуйста, смотрите код ниже:
Модель (Shout.cs):
namespace MvcForumTest.Models
{
public class Shout
{
public int Id { get; set; }
public string Author { get; set; }
public string Message { get; set; }
public DateTime EntryDate { get; set; }
public Shout()
{
Id = 1;
Author = "TestUser";
EntryDate = DateTime.Now;
}
}
}
View Model (ShoutboxView.cs)
namespace MvcForumTest.ViewModels
{
public class ShoutboxView
{
public Shout newShout { get; set; }
public IEnumerable<Shout> Shouts { get; set; }
}
}
Controller (ShoutController.cs):
namespace MvcForumTest.Controllers
{
public class ShoutController : Controller
{
private ForumsContext db = new ForumsContext();
public ActionResult Index()
{
ShoutboxView shoutboxView = new ShoutboxView
{
newShout = new Shout(),
Shouts = (from s in db.Shouts
orderby s.EntryDate descending
select s).Take(20)
};
return PartialView(shoutboxView);
}
[HttpPost]
public ActionResult AddShout(ShoutboxView shoutbox)
{
Shout shout = new Shout();
shout.Message = shoutbox.newShout.Message;
if (ModelState.IsValid)
{
db.Shouts.Add(shout);
db.SaveChanges();
return PartialView("Index", shoutbox);
}
//return PartialView("_ShoutList", db.Shouts);
return PartialView("Index", shoutbox);
}
}
}
Индексный частичный просмотр (Index.cshtml). Вот где я получаю ошибку. На "@ Html.Partial (" _ ShoutList "Model.Shouts)" линия:
@model MvcForumTest.ViewModels.ShoutboxView
@using (Ajax.BeginForm("AddShout", "Shout", new AjaxOptions { UpdateTargetId = "shoutboxWrapper", InsertionMode = InsertionMode.Replace}))
{
@Html.EditorFor(model => model.newShout.Message)
<input type="submit" value="Submit" />
}
<div id="shoutboxWrapper">
@Html.Partial("_ShoutList", Model.Shouts)
</div>
Shout частичный вид (_Shoutlist.cshtml):
@model IEnumerable<MvcForumTest.Models.Shout>
@foreach (var item in Model)
{
<div class="shout">
<table>
<tr>
<td class="shoutDelete">
@Html.ActionLink("Delete", "Delete", new { id=item.Id })
</td>
<td class="shoutAuthor">
@Html.DisplayFor(model => item.Author)
</td>
<td class="shoutDate">
@Html.DisplayFor(model => item.EntryDate)
</td>
</tr>
<tr>
<td class="shoutMessage">
@Html.DisplayFor(model => item.Message)
</td>
</tr>
</table>
</div>
}
Как я могу это исправить? Должен ли я называть что-то другое, кроме @Html.Partial
, чтобы отобразить частичный вид ребенка? Или есть другой способ, которым я должен проходить в детской модели?
Edit:
_Layout.cshtml:
<div id="body">
@RenderSection("featured", required: false)
<section class="content-wrapper main-content clear-fix">
@Html.Action("Index", "Shout")
@RenderBody()
</section>
</div>
Я отредактировал исходное сообщение, чтобы включить то, что находится в _Layout.cshtml. Индекс - это частичное представление, которое загружается в _Layout. Это то, что я хочу показать во всех представлениях, которые используют _Layout.cshtml. – Soldat1988
Я заново создал макет и добавил полный вид, в котором ничего нет, и снова, он отлично работал для меня. В Index.cshtml, если я изменю @ Html.Partial («_ ShoutList», Model.Shouts) на @ Html.Partial («_ ShoutList», Model), тогда я увижу ту же ошибку, что и вы.Вы уверены, что этот просмотр «Index» отображается, а не другой с другого контроллера? – Hossein