我构建了一个粗略的 HTML Helper 方法,目的是创建两个分页链接(Next 和 Previous)。
下面是传递给辅助方法的 ViewModel (DTO) 的代码:
public class PaginationVM
{
public int TotalItems { get; set; }
public int ItemsPerPage { get; set; }
public int CurrentPage { get; set; }
public int TotalPages
{
get { return (int)Math.Ceiling((decimal)TotalItems / ItemsPerPage); }
}
}
下面是 HTML Helper 方法的代码:
public static MvcHtmlString Paginator(this HtmlHelper htmlHelper, PaginationVM pInfo)
{
StringBuilder result = new StringBuilder();
var nextPage = pInfo.CurrentPage + 1;
var prevPage = pInfo.CurrentPage - 1;
if (pInfo.CurrentPage < pInfo.TotalPages)
{
TagBuilder tagA = new TagBuilder("a");
tagA.MergeAttribute("href", "page/" + nextPage);
tagA.InnerHtml = "Prev";
tagA.AddCssClass("prev");
result.Append(tagA.ToString());
}
else
{
TagBuilder tagB = new TagBuilder("a");
tagB.MergeAttribute("href", "page/" + prevPage);
tagB.InnerHtml = "Next";
tagB.AddCssClass("next");
result.Append(tagB.ToString());
}
return MvcHtmlString.Create(result.ToString());
}
上面的代码组合似乎有效,但只能从主页开始,如果我单击 Prev 链接 [ localhost:xxxx/page/2 ],然后转到第 2 页,则链接变为 [ localhost:xxxx/page/page/2 ].
我的路由如下所示
routes.MapRoute(
"PagingPosts/param", // Route name
"page/{pageId}", // /page/3
new { controller = "Home", action = "Index", pageId = UrlParameter.Optional }, // Parameter defaults
new { pageId = @"\d+" } // Constraints: pageId must be numerical
);
如您所见,单词 page 现在已复制。我可以想到一种解决此问题的方法,那就是告诉它从根目录生成一个 ActionLink,并以此方式构建我的 URL,但我不确定如何在 HTML 帮助程序中执行此操作,以及最好的方法是。
最佳答案
一个好方法是定义一个接受 Func<int, string>
的助手可以传递页码并返回生成的 URL 字符串的委托(delegate)。这样,分页器助手就不会绑定(bind)到任何特定的路由,并且可以轻松地在您的应用程序中重复使用。
有点像
public static MvcHtmlString Paginator(this HtmlHelper htmlHelper,
PaginationVM pInfo,
Func<int, string> pageUrl)
{
StringBuilder result = new StringBuilder();
if (pInfo.TotalPages > 1)
{
TagBuilder tag;
// previous link
if (pInfo.CurrentPage > 1)
{
tag = new TagBuilder("a");
tag.MergeAttribute("href", pageUrl(pInfo.CurrentPage - 1));
tag.AddCssClass("Prev");
tag.InnerHtml = "previous";
result.AppendLine(tag.ToString());
}
// numbered links
for (int i = 1; i <= pInfo.TotalPages; i++)
{
if (i == pInfo.CurrentPage)
{
tag = new TagBuilder("span");
}
else
{
tag = new TagBuilder("a");
tag.MergeAttribute("href", pageUrl(i));
}
tag.InnerHtml = i.ToString();
result.AppendLine(tag.ToString());
}
// next page link
if (pInfo.CurrentPage < pInfo.TotalPages)
{
tag = new TagBuilder("a");
tag.MergeAttribute("href", pageUrl(pInfo.CurrentPage + 1));
tag.AddCssClass("Next");
tag.InnerHtml = "next";
result.AppendLine(tag.ToString());
}
}
return MvcHtmlString.Create(result.ToString());
}
现在在你看来,你会像这样使用它
@Html.Paginator(pageInfo, pageId => Url.Action("Index", "Home", new { pageId }))
关于asp.net-mvc-3 - 在 HtmlHelper 方法中生成正确的 Url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8579785/