asp.net-mvc-3 - 在 HtmlHelper 方法中生成正确的 Url

标签 asp.net-mvc-3 pagination html-helper

我构建了一个粗略的 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/

相关文章:

c# - Ninject:通用类的默认和特定绑定(bind)

jquery - 提交表单警报保存对话框

asp.net-mvc-3 - MVC3 中的内存增加

php - Laravel - 分页并附加搜索结果

php - 如何使循环函数调用分页?

asp.net-mvc - HTMLHelper,在属性外生成 "Expression<Func<TModel, TValue>> expression"类型的参数

performance - 如何提高电子商务网站的搜索性能?

ruby-on-rails - 如何使用 Kaminari 按数值对页面进行分页?

html - MVC : Send parameters to method by a button

c# - 如何接受 html 内容作为 MVC+Razor 中辅助函数的参数?