如何使用自定义方法/操作链接进行分页
本文关键字:分页 链接 操作 何使用 自定义方法 | 更新日期: 2023-09-27 18:32:18
我在这里可能完全错误了,但这部分是我要问的。
我正在使用MVC3创建一个博客,但我遇到了一些问题。 我的主页目前正确列出了每篇博客文章及其相应的评论和主题。 我希望它仅限于许多帖子,所以这是我在HomeController中的代码。
public class HomeController : Controller
{
private MyDB db = new MyDB();
public ActionResult Index()
{
var posts = (from p in db.Set<BlogPost>()
orderby p.DateCreated descending
select new PostViewModel
{
Title = p.Title,
DateCreated = p.DateCreated,
Content = p.Content,
Topics = p.Topics,
Comments = p.Comments,
CommentCount = p.Comments.Count
}).Take(5).ToList();
IEnumerable<Topic> topics = from t in db.Topics
select t;
var blog = new BlogViewModel
{
Post = posts,
Topics = topics.Select(t => new SelectListItem {
Value = Convert.ToString(t.id),
Text = t.Name
})
};
return View(blog);
}
}
正如我所说,这工作正常。 我有单独的主题,因为我想最终按这些主题排序(我也不知道从哪里开始,但那是另一回事)。
我的主要问题是我想在 5 个选定的帖子下有一个"下一个"和"上一个"按钮,单击时,抓住下一个 5 个或前 5 个。 我被告知使用...
@Html.ActionLink("Next >>", "ActionName", "Home", Custom arguement?)
解决方案类型,我在 HomeController 中编写自定义方法并获取下一个或上一个 5。 这是对的吗? 我想了解这样的东西的最佳使用场景。 我是MVC3的新手,所以我不是在寻找捷径,我觉得我可能已经做了一些捷径。
感谢您的帮助。
https://github.com/TroyGoode/PagedList
public class HomeController : Controller
{
public ActionResult Index(int? page)
{
var posts = (from p in db.Set<BlogPost>()
orderby p.DateCreated descending
select new PostViewModel
{
Title = p.Title,
DateCreated = p.DateCreated,
Content = p.Content,
Topics = p.Topics,
Comments = p.Comments,
CommentCount = p.Comments.Count
});
var pageNumber = page ?? 1; // if no page was specified in the querystring, default to the first page (1)
posts = posts.ToPagedList(pageNumber, 25); // will only contain 25 posts max because of the pageSize
var blog = new BlogViewModel
{
Post = posts,
Topics = topics.Select(t => new SelectListItem {
Value = Convert.ToString(t.id),
Text = t.Name
})
};
return View(blog);
}
}
我看到两个最好的方案:
你可以使用 Ajax/Jquery 来做到这一点。
二 您使用"部分"视图。这样,当有人按下接下来五个操作链接时,您不会影响整个视图。因此,您将只为帖子制作部分视图,然后控制器收到接下来五个帖子的请求,并返回具有五个帖子项的模型的部分视图。
选择你觉得更舒服的,但如果你正在学习MVC,选择两个可能更适合你的练习。
你可以看看: http://nerddinnerbook.s3.amazonaws.com/Part8.htm .此外,如果您想使用 ajax 请求获取数据,我建议您将包含数据的部分视图转换为字符串(使用 JSON (ASP MVC 3)返回 Razor 部分视图)并使用 jquery 加载它(http://api.jquery.com/load/)。
我会在您的控制器上请求另一种操作方法(使用 Ajax 或普通),并重用您用于初始页面渲染的相同视图。
public ActionResult Index(int? pageNumber)
{
if(!pageNumber.HasValue)
return Index();
var posts = ...; // get posts
var set = posts.Skip(pageNumber * itemsPerPage).Take(itemsPerPage);
// or pageNumber - 1 if you want to be 1-index based
return View(...); //or PartialView() if doing ajax, or even Json() if you want to bind on the client side
}
您可以创建控制器,如以下示例代码:
public ViewResult List(string category, int page = 1) {
ProductsListViewModel viewModel = new ProductsListViewModel {
Products = repository.Products
.Where(p => category == null ? true : p.Category == category)
.OrderBy(p => p.ProductID)
.Skip((page - 1) * PageSize)
.Take(PageSize),
PagingInfo = new PagingInfo {
CurrentPage = page,
ItemsPerPage = PageSize, //4 for example
TotalItems = category == null ?
repository.Products.Count() :
repository.Products.Where(e => e.Category == category).Count()
},
CurrentCategory = category
};
return View(viewModel);
}
在视图中,放置以下自定义 HTML 帮助程序:
<div class="pager">
@Html.PageLinks(Model.PagingInfo, x => Url.Action("List",
new {page = x, category = Model.CurrentCategory}))
</div>
以下是帮助程序的代码:
public static class PagingHelpers {
public static MvcHtmlString PageLinks(this HtmlHelper html,
PagingInfo pagingInfo,
Func<int, string> pageUrl) {
StringBuilder result = new StringBuilder();
for (int i = 1; i <= pagingInfo.TotalPages; i++) {
TagBuilder tag = new TagBuilder("a"); // Construct an <a> tag
tag.MergeAttribute("href", pageUrl(i));
tag.InnerHtml = i.ToString();
if (i == pagingInfo.CurrentPage)
tag.AddCssClass("selected");
result.Append(tag.ToString());
}
return MvcHtmlString.Create(result.ToString());
}
}
这个例子取自这本书