2013-07-28 2 views
3

У меня есть строго типизированный частичный вид, который отображается внутри _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> 

ответ

1

Я вновь создал свой проект со следующими изменениями в ShoutController:

var shouts = (from s in db.Shouts 
        orderby s.EntryDate descending 
        select s) 
        .Take(20) 
        .ToList(); 

shouts.Add(new Shout{Author = "T", EntryDate = DateTime.Now, Id = 1, Message = "some message"}); 
shouts.Add(new Shout { Author = "T2", EntryDate = DateTime.Now, Id = 2, Message = "some message2" }); 

var shoutboxView = new ShoutboxView 
{ 
    newShout = new Shout(), 
    Shouts = shouts 
}; 

return PartialView(shoutboxView); 

и загружает штраф при посещении ~/Shout/Index. Вы говорите, что внутри _Layout.cshtml существует строго типизированное частичное представление. Является ли Индекс частью частичного просмотра? Если это так, то каков полный вид, который использует _Layout.cshtml и какой метод действия для этого? Это будет код, на который нужно смотреть.

+0

Я отредактировал исходное сообщение, чтобы включить то, что находится в _Layout.cshtml. Индекс - это частичное представление, которое загружается в _Layout. Это то, что я хочу показать во всех представлениях, которые используют _Layout.cshtml. – Soldat1988

+0

Я заново создал макет и добавил полный вид, в котором ничего нет, и снова, он отлично работал для меня. В Index.cshtml, если я изменю @ Html.Partial («_ ShoutList», Model.Shouts) на @ Html.Partial («_ ShoutList», Model), тогда я увижу ту же ошибку, что и вы.Вы уверены, что этот просмотр «Index» отображается, а не другой с другого контроллера? – Hossein

0

Я думаю, вы должны выбрать Крики AsEnumerable().

  return PartialView("_ShoutList", db.Shouts.AsEnumerable()); 
+0

Если я использую это в AddShout вместо того, чтобы возвращать PartialView («Index», shoutbox), он частично возвращает частичный вид «_ShoutList» на своей собственной странице. – Soldat1988

Смежные вопросы