我需要帮助。我正在使用 MVC 4 做一个简单的博客。
Edit3:总的来说,概念如下:左侧是带有类别的导航栏,右侧是带有ajax分页的帖子。当您单击具体帖子时,我们会转到包含帖子详细信息的页面。
我有一个布局:
<body>
<div class="container-fluid">
<div class="row-fluid">
<div class="sidebar-nav-fixed fill">
@Html.Action("GetCategories","Navigation")
</div>
<div class="sidebar-nav-fixed-stuck-left fill white">
<div class="container-fluid">
<div class="row-fluid">
<div class="span12">
<div class="content-area">
@RenderBody()
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
我从带有分页的帖子控制器列表返回。Pager 创建到控制器的 ajax 链接:
<a data-ajax=\"true\" data-ajax-method=\"GET\" data-ajax-mode=\"replace\" href=\"{0}\" data-page=\"{1}\">{2}</a>
如果我返回一个没有布局的部分视图,它只呈现部分视图,但 ajax 分页有效。如果我返回带有布局的部分视图,它会完美呈现,ajax 查询有效,控制器返回部分视图,但分页不起作用。
看法
@model PagingListViewModel<PostViewModel>
@*@{
Layout = "~/Views/Shared/_Layout.cshtml";
}*@
@foreach (var post in Model.Items)
{
@Html.DisplayFor(_ => post,"Post")
}
@Html.DisplayFor(x => x.PageInfo)
编辑:我使用自定义寻呼机。如果标志“isAjax”为真,它会生成 ajax 链接。这是一种为每个页面生成链接的方法
private string GeneratePageLink(string linkText, int pageNumber)
{
var pageLinkValueDictionary = new RouteValueDictionary(linkWithoutPageValuesDictionary);
pageLinkValueDictionary[Page] = pageNumber;
var contextQueryString = requestContext.HttpContext.Request.QueryString;
foreach (string queryStrings in contextQueryString)
{
if (queryStrings.Equals(Page, StringComparison.OrdinalIgnoreCase) ||
pageLinkValueDictionary.ContainsKey(queryStrings))
continue;
pageLinkValueDictionary.Add(queryStrings, contextQueryString[queryStrings]);
}
var virtualPath = RouteTable.Routes.GetVirtualPath(requestContext, pageLinkValueDictionary) == null
? string.Empty
: RouteTable.Routes.GetVirtualPath(requestContext, pageLinkValueDictionary)
.VirtualPath;
return string.Format(
isAjax
? "<li><a data-ajax=\"true\" data-ajax-method=\"GET\" data-ajax-mode=\"replace\" href=\"{0}\" data-page=\"{1}\">{2}</a></li>"
: "<li><a href=\"{0}\" data-page=\"{1}\">{2}</a></li>",
virtualPath, pageNumber, linkText
);
}
编辑2:
[HttpGet]
public ActionResult Posts(int? page)
{
... query to database
return AjaxPagingList<Post, PostViewModel>(posts, "PostsList")
}
protected ActionResult AjaxPagingList<TItem, TModel>(IEnumerable<TItem> itemsObjects, string view)
where TItem : class, where TModel: class
{
var items = AutoMappingProvider.MapToList<TItem>(itemsObjects);
var catalogViewModel = new PagingListViewModel<TModel>
{
....
}
return PartialView(view, catalogViewModel);
}