我有一个“票证”视图,其中包含部分“评论”视图。票证可以有很多评论。我想在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);
}
答案 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社区采取臀部臀部! ;)
向特洛伊喊出甜蜜的插件!