【问题标题】:PartialView MVC - PartialView functionality different than ViewPartialView MVC - PartialView 功能不同于 View
【发布时间】:2015-05-09 14:52:23
【问题描述】:

我有一个带有“评论”部分视图的“票证”视图。一个 Ticket 可以有多个 cmets。我想在 Ticket 视图中创建 Comments 的部分视图,以便我可以在 Comments 中添加分页功能,而不会影响 Ticket 视图。 (我将有 2 个其他部分具有与不同数据相关但与票证相关联的相同功能)我正在尝试使用通过 Nuget 提供的 PagedList 库。

理论上,我将票证模型传递给 GetComments 控制器,在该控制器中我搜索票证 cmets 并比较票证 ID。我将评论的 ToPagedList 返回到局部视图。我希望分页在局部视图中和 GetComments 控制器中工作。 (我想保留带有“开箱即用”功能的门票的“详细信息”控制器。例如 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);
    }

【问题讨论】:

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


    【解决方案1】:

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

    请注意,尽管您的部分需要“IPagedList”,但您拥有的代码将尝试呈现部分视图并将其传递给“DearSanta.Models.Ticket”。

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

    【讨论】:

    • 这个方案解决了局部视图用自己的控制器的局部渲染,谢谢。
    【解决方案2】:

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

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

    我希望将来有人会发现此解决方案有帮助。这是我的第二个答案。我开始能够给予与接受总是从 SO 社区臀部臀部万岁! ;)

    向 Troy 喊出这个甜蜜的插件!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多