2015-05-09 115 views
1

我有一個包含「註釋」部分視圖的「票據」視圖。票可以有很多評論。我想在Ticket視圖中創建評論的部分視圖,以便可以在不影響票證視圖的情況下將分頁功能添加到評論。 (我會有2個具有相同的功能屬於不同的數據,但與票證相關的其他部分)我試圖使用可通過Nuget的PagedList庫。部分視圖MVC - 與視圖不同的部分視圖功能

理論上,我將票模型傳遞給GetComments控制器,我在其中搜索票證評論,比較ticketId。我將註釋的ToPagedList返回到局部視圖。我希望分頁在分部視圖和GetComments控制器內工作。 (我想離開「開箱即用」功能的'詳細'控制器的門票。例如返回查看(db.tickets.find(id))

我從來沒有實現過部分之前,這是我第4周的學習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); 
    } 

回答

1

@ Html.Partial()呈現一個視圖 - 它沒有通過控制器。它最常用於靜態內容。如果你需要通過控制器,你應該使用@ Html.Action()。

請注意,儘管您的部分期望爲「IPagedList < DearSanta.Models.TicketComment>」,但您的代碼將嘗試呈現將部分視圖傳遞給它的「DearSanta.Models.Ticket」。

有關@ Html.Partial()和@ Html.Action之間更詳細的區別,請參閱here

+0

該解決方案解決了使用自己的控制器部分視圖的部分渲染,謝謝。 – JReam

0

我想指出,我的問題有兩個問題。

第一個問題是我沒有使用@ HTML.Action,Dzhenko指出。這解決了使用自己的控制器注入局部視圖的使用,我可以傳遞一些東西(不管是對象還是值等)。

我遇到這個問題的第二個問題是我的@ 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社區時髦的髖關節!;)

向特洛伊大聲喊出甜美的插件!