我无法弄清楚如何使用ajax获取部分视图来呈现分页列表。
我最接近工作的是来自Using paging in partial view, asp.net mvc
的例子我基本上尝试创建一个页面,其中包含每个用户的评论列表,其中页面可以像stackoverflow用户页面上的答案选项卡一样进行更改。
在第一次寻呼机点击时,分页工作正常,但是一旦我再次点击寻呼机,部分视图就会返回。
控制器:
public class ProductController : Controller
{
public IQueryable<Product> products = new List<Product> {
new Product{ProductId = 1, Name = "p1"},
new Product{ProductId = 2, Name = "p2"},
new Product{ProductId = 3, Name = "p3"},
new Product{ProductId = 4, Name = "p4"},
new Product{ProductId = 5, Name = "p5"}
}.AsQueryable();
public object Index()
{
return View();
}
public object Products(int? page)
{
var pageNumber = page ?? 1; // if no page was specified in the querystring, default to the first page (1)
var onePageOfProducts = products.ToPagedList(pageNumber, 3); // will only contain 25 products max because of the pageSize
ViewBag.OnePageOfProducts = onePageOfProducts;
return PartialView("_Products");
}
}
查看:
Index.cshtml:
<link href="/Content/PagedList.css" rel="stylesheet" type="text/css" />
<h2>List of Products</h2>
<div id="products">
@Html.Action("Products", "Product")
</div>
@section scripts{
<script type="text/javascript">
$(function() {
$('#myPager').on('click', 'a', function() {
$.ajax({
url: this.href,
type: 'GET',
cache: false,
success: function(result) {
$('#products').html(result);
}
});
return false;
});
});
</script>
}
_Products.cshtml:
@using PagedList.Mvc;
@using PagedList;
<ul>
@foreach(var product in ViewBag.OnePageOfProducts){
<li>@product.Name</li>
}
</ul>
<!-- output a paging control that lets the user navigation to the previous page, next page, etc -->
<div id="myPager">
@Html.PagedListPager((IPagedList)ViewBag.OnePageOfProducts, page => Url.Action("Products", new { page }))
</div>
模型
public class Product
{
public int ProductId { get; set; }
public string Name { get; set; }
}
有谁能告诉我我做错了什么?
答案 0 :(得分:12)
我最终使用了pagedlist源[https://github.com/troygoode/PagedList][1]
中不显眼的ajax示例局部视图:
@using PagedList;
@using PagedList.Mvc;
<ul id="names" start="@ViewBag.Names.FirstItemOnPage">
@foreach(var i in ViewBag.Names){
<li>@i</li>
}
</ul>
@Html.PagedListPager((IPagedList)ViewBag.Names, page => Url.Action("Index", new { page }), PagedListRenderOptions.EnableUnobtrusiveAjaxReplacing( new AjaxOptions(){ HttpMethod = "GET", UpdateTargetId = "unobtrusive"}))
索引:
@{
ViewBag.Title = "Unobtrusive Ajax";
}
@using PagedList;
@using PagedList.Mvc;
@Styles.Render("~/Content/PagedList.css")
<h2>Unobtrusive Ajax</h2>
<p>Example of paging a list:</p>
<div id="unobtrusive">
@Html.Partial("UnobtrusiveAjax_Partial")
</div>
控制器:
public class UnobtrusiveAjaxController : BaseController
{
// Unobtrusive Ajax
public ActionResult Index(int? page)
{
var listPaged = GetPagedNames(page); // GetPagedNames is found in BaseController
if (listPaged == null)
return HttpNotFound();
ViewBag.Names = listPaged;
return Request.IsAjaxRequest()
? (ActionResult)PartialView("UnobtrusiveAjax_Partial")
: View();
}
}
答案 1 :(得分:3)
以防万一,因为原来的问题没有得到回答。我想问题是,点击处理程序没有重新连接到AJAX请求生成的新寻呼机元素。在这种情况下,我也不喜欢不引人注目的AJAX解决方案,因为在嵌套视图中对pager id进行硬编码,而以其他方式传递它可能过于繁琐。
<script type="text/javascript">
// better not to clutter global scope of course, just for brevity sake
var attachHandlers = function() {
$('#myPager a').click(function() {
$('#myPager').load(this.href, function() {
attachHandlers();
});
return false;
});
};
$(document).ready(function () {
attachHandlers();
});
</script>