帮助自定义剃刀HelperResult创建

时间:2011-09-05 11:45:26

标签: .net asp.net asp.net-mvc asp.net-mvc-3 razor

在我的ASP.NET MVC 3项目中,我创建了一个PaginatedList帮助器。我在视图中处理如下:

@model TugberkUgurlu.Mvc.Helpers.PaginatedList<ContactModel>

@*
some razor code here to display the data
*@

<div id="pager">

    @if (Model.HasPreviousPage)
    {

        @:@Html.RouteLink("<<<< Previous",
                   "Default",
                    new { page = (Model.PageIndex - 1) })

    }

    @if (Model.TotalPages >= 2)
    {

        for (int i = 0; i < Model.TotalPages; i++)
        {

            int value = i + 1;

            if (Model.PageIndex == i)
            {

                @:@Html.RouteLink(value.ToString(),
                   "Default",
                    new { page = (i) }, new { @class = "bold" })

            }
            else
            { 

                @:@Html.RouteLink(value.ToString(),
                   "Default",
                    new { page = (i) })

            }

        }
    }

    @if (Model.HasNextPage)
    {

        @:@Html.RouteLink("Next >>>>",
                   "Default",
                    new { page = (Model.PageIndex + 1) })

    }

</div>

我想为<div id="pager"></div>元素中的代码创建一个HelperResult,这样我就不会重复自己了,最重要的是,当我对该代码进行更改时,它会在任何地方进行更改正在使用。

我还没有想出最好的主意。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

对于我的使用,我意识到帮助者会做一些类似于你的要求的帮助。我使用了一些其他变量,但我认为你可以得到这个想法,可以根据你的需要获取我的代码和修改

public static MvcHtmlString PageLinks(this HtmlHelper html, int totalItems, int itemsPerPage, int currentPage, Func<int, string> pageUrl)
{
  return PageLinks(html, totalItems, itemsPerPage, currentPage, "", "", pageUrl);
}

public static MvcHtmlString PageLinks(this HtmlHelper html, int totalItems, int itemsPerPage, int currentPage, string cssClass, string cssClassSelectedPage, Func<int, string> pageUrl)
{
  int totalPages = (int)Math.Ceiling((decimal)totalItems / itemsPerPage);
  StringBuilder result = new StringBuilder();
  for (int i = 1; i <= totalPages; i++)
  {
    string css = cssClass;
    TagBuilder tag = new TagBuilder("a");
    tag.MergeAttribute("href", pageUrl(i));
    tag.InnerHtml = i.ToString();
    if (i == currentPage)
      css += " " + cssClassSelectedPage;
    if (!String.IsNullOrEmpty(cssClass))
      tag.AddCssClass(css);
    result.AppendLine(tag.ToString());
  }
  return MvcHtmlString.Create(result.ToString());
}

然后从视图中你可以这样打电话:

@Html.PageLinks(Model.TotalItems, Model.PageSize, Model.Page, "page_link", "active_page", x => Url.Action("MyList", "Home", new { page = x }))%>

基本上我传递一个带路由规则的函数来生成所有链接

这是我在Global.asax中的规则

      routes.MapRoute("", "MyList/{page}", new { controller = "Home", action = "MyList", page = 0 }, new { page = @"\d+" });

希望它可以帮助您完成任务