PartialView MVC - 与 View 不同的 PartialView 功能

PartialView MVC - PartialView functionality different than View

我有一个 'Ticket' 视图和 "Comments" 的部分视图。一张票可以有很多评论。我想在工单视图中创建 Comments 的部分视图,这样我就可以在不影响工单视图的情况下向 Comments 添加分页功能。 (我将有 2 个其他部分,它们具有与不同数据相关的相同功能,但与票证相关联)我正在尝试使用通过 Nuget 提供的 PagedList 库。

理论上,我将工单模型传递给 GetComments 控制器,我在其中搜索工单评论并比较 ticketId。我 return 一个 ToPagedList of Comments 到局部视图。我希望分页在局部视图和 GetComments 控制器中工作。 (我想留下 'Details' 具有 'out of the box' 功能的 Tickets 控制器。例如 return View(db.tickets.find(id))

我以前从未实现过部分,这是我学习 MVC 的第 4 周,非常感谢任何帮助!

父视图:TicketDetails.cshtml

 @model  DearSanta.Models.Ticket
  //ticket display markup removed to simplify

 // Where I wan my partial view of comments
 <div class="col-md-4">        
    @Html.Partial("GetComments", Model)
</div>

局部视图:GetComments.cshtml

@model  IPagedList<DearSanta.Models.TicketComment>
@using PagedList;

@section CSS{
 <link href="~/Content/PagedList.css" rel="stylesheet" type="text/css">
}


<div id="comments">
  <h4 class="title">Ticket Comments</h4>

  <ul class="timeline">
    @foreach (var c in Model)
    {

        <li>
            <i class="fa fa-comment"></i>
            <span class="date">@c.CreateDate.ToString("d MMM")</span>
            <div class="content">
                <p><strong>@c.User.DisplayName</strong> @c.Comment</p>
                <small>@Convert.ToInt32(((DateTime.Now -   c.CreateDate).TotalDays)) days ago</small>
            </div>
        </li>

    }
  </ul>
  <div>
    Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of  @Model.PageCount
    @Html.PagedListPager(Model, page => Url.Action("GetComments","Tickets",  new { page }))
 </div>
</div>

部分视图控制器:

         //Controller references: using PagedList;
                                  using PagedList.Mvc;


 public PartialViewResult GetComments(Ticket model, int page = 1)
    {
        int pageSize = 3; 

        var comments = db.TicketComment.Where(c => c.TicketId == model.TicketId).ToPagedList(page, pageSize);

        return PartialView("GetComments", comments);
    }

@Html.Partial() 呈现视图 - 它不通过控制器。它最常用于静态内容。如果你需要通过控制器,你应该使用@Html.Action().

请注意,您拥有的代码将尝试呈现传递给它的局部视图 "DearSanta.Models.Ticket",尽管您的局部视图需要 "IPagedList< DearSanta.Models.TicketComment >"。

有关@Html.Partial() 和@Html.Action 之间更详细的区别,请参阅here

我想指出我的问题有两个问题。

第一个问题是我没有像 Dzhenko 指出的那样使用 @HTML.Action。这解决了使用自己的控制器注入局部视图的问题,我可以将某些东西传递给它(无论是对象还是值等)。

我遇到的第二个问题是我的@Html.PagedListPager 没有进行 Ajax 调用。这导致我的整个页面只重新加载部分页面。因此,我将我的代码更改为以下内容,它现在生成一个带有分页视图的父视图,分页仅适用于分页。

父视图:

@model  DearSanta.Models.Ticket
     //ticket display markup removed to simplify

    // Where I wan my partial view of comments
 <div class="col-md-4">        
     @Html.Action("GetComments", new { ticketId = Model.TicketId })
</div>

局部视图:

@model  PagedList.IPagedList<DearSanta.Models.TicketComment>
@using PagedList.Mvc;

@section CSS{
    <link href="~/Content/PagedList.css" rel="stylesheet" type="text/css">
}


<div id="comments">
    <h4 class="title">Ticket Comments</h4>

    <ul class="timeline">
        @foreach (var c in Model)
        {

            <li>
                <i class="fa fa-comment"></i>
                <span class="date">@c.CreateDate.ToString("d MMM")</span>
                <div class="content">
                    <p><strong>@c.User.DisplayName</strong> @c.Comment</p>
                    <small>@Convert.ToInt32(((DateTime.Now - c.CreateDate).TotalDays)) days ago</small>
                </div>
            </li>

        }
    </ul>
    <div>
        Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
        @Html.PagedListPager(Model, 
                                page => Url.Action("GetComments", new { ViewBag.ticketId, page }), 
                                PagedListRenderOptions.EnableUnobtrusiveAjaxReplacing( new AjaxOptions(){  HttpMethod = "GET", UpdateTargetId = "comments"})
                             )
    </div>
</div>

局部视图控制器:

public PartialViewResult GetComments(int? ticketId, int page = 1)
        {
            int pageSize = 3;

            var comments =  (from c in db.TicketComment
                                where c.TicketId == ticketId
                                orderby c.CreateDate descending
                                select c).ToPagedList(page, pageSize);

            ViewBag.ticketId = ticketId;

            return PartialView("GetComments", comments);
        }

我希望以后有人会发现此解决方案有帮助。这是我的第二个 post 答案。我开始能够给予与索取总是从 SO 社区 hip hip horray!! ;)

向 Troy 大声喊出甜蜜的插件!