PartialView MVC - 与View不同的PartialView功能

时间:2015-05-09 14:52:23

标签: asp.net-mvc pagination partial-views

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

理论上,我将票证模型传递给GetComments控制器,在那里我搜索比较ticketId的票证评论。我将ToPagedList of Comments返回到局部视图。我希望分页在局部视图和GetComments控制器中工作。 (我希望将Tickets的'Details'控制器保留为'开箱即用'功能。例如,返回View(db.tickets.find(id))

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

父视图: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);
    }

2 个答案:

答案 0 :(得分:1)

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

请注意,您拥有的代码将尝试渲染传递它的部分视图&#34; DearSanta.Models.Ticket&#34;虽然你的部分期望&#34; IPagedList&lt; DearSanta.Models.TicketComment&gt;&#34;。

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

答案 1 :(得分:0)

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

第一个问题是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);
        }

我希望有人可能会在将来找到这个解决方案。这是我的第二篇文章。我开始能够给予vs总是从SO社区采取臀部臀部! ;)

向特洛伊喊出甜蜜的插件!