• ASP.NET MVC HtmlHelper 自定义扩展分页功能


    以下是Steven Sanderson的《Pro ASP.NET MVC2 Framework(second edition)》上的例子,以及一些我的说明(以下说明都基于你对C#一些或新或旧语法的了解):
    整体的思想是把“分页”做成一个组件,利于复用。
    具体的是,首先给HtmlHelper扩展一个方法(有关扩展方法可参数相关文档,如MSDN),这个方法返回的是一个能被<%%>语法解析的MvcHtmlString对象,事实上这个对象包含的内容则是HTML标签<a>。扩展方法如下:
    public static class PagingHelpers
    {
    public static MvcHtmlString PageLinks(this HtmlHelper html, PagingInfo pageInformation,
    Func<int, string> pageUrl)
    {
    StringBuilder result = new StringBuilder();

    for (int i = 1; i <= pageInformation.TotalPages; i++)
    {
    TagBuilder tag = new TagBuilder("a");

    tag.MergeAttribute("href", pageUrl(i));
    tag.InnerHtml = i.ToString();

    if (i == pageInformation.CurrentPage)
    {
    tag.AddCssClass("selected");
    }

    result.AppendLine(tag.ToString());
    }

    return MvcHtmlString.Create(result.ToString());
    }
    }
    从方法体可以理解到,需要分页的数据的每一页此方法都将为其提供一个链接,如此每一页数据就会对应一个URL。正如之前我说过那样,这会是一个好的用户体验。

    再看视图(View)是怎样调用此方法来实现分布的,以下是名为List(List为强类型(strongly typed)视图,其类型为ProductsListViewModel,对此类型一会儿将作解释)的视图调用此方法来实现分页的代码:
    <%: Html.PageLinks(Model.PagingInfo,i => Url.Action("List", new { category = Model.CurrentCategory, page = i }))%>
    可以看到,调用扩展的分页方法时我们传入了两个实参,一个是Model.PagingInfo,一个是lambda表达式(有关lambda表达式可参考相关文档,如MSDN)i => Url.Action("List", new { category = Model.CurrentCategory, page = i })。
    在看第一个参数Model.PagingInfo之前,我们先看看Model的类型定义:
    public class ProductsListViewModel
    {
    public IList<Product> Products { get; set; }
    public PagingInfo PagingInfo { get; set; }
    public string CurrentCategory { get; set; }
    }
    此类型有三个属性,在此我们仅需关心其第二个属性,PagingInfo类型的PagingInfo(名字取成一样,希望不要混淆)属性。PagingInfo类型定义如下:
    public class PagingInfo
    {
    public int CurrentPage { get; set; }//当前页码
    public int TotalItems { get; set; }//数据总记录数
    public int ItemsPerPage { get; set; }//每页记录数

    public int TotalPages//总页数
    {
    get
    {
    return (int)(Math.Ceiling((decimal)TotalItems / ItemsPerPage));
    }
    }
    }
    这就是我们分页时所关心的信息,也正是我们调用扩展的分页方法时需要传递过去的信息。当然,这些信息不会凭空而生,而需要我们自己设置。

    我所举的例子是Steven Sanderson的《Pro ASP.NET MVC2 Framework(second edition)》所提供的一个以视图List来分页产品的例子。应当注意,用户从浏览器请求/list时,他请求的不是list.aspx那个页面(虽然我们为用户显示的就是它),他请求的是我们一个叫List的Action。这也就意味着,为输出用户需要的那个List.aspx我们需要做的准备工作(当然,不是业务逻辑)都将在名叫List的Action里进行,Action List定义如下:
    public ViewResult List(string category, int page = 1/*C#的形参默认值(参考C# 4’s
    optional parameter)*/)
    {
    var productsToShow = (category == null ? productsRepository.Products : productsRepository.Products.Where(x => x.Category == category));
    var viewModel = new ProductsListViewModel
    {
    Products = productsToShow.Skip((page - 1) * PageSize).Take(PageSize).ToList(),
    PagingInfo = new PagingInfo { CurrentPage = page, TotalItems = productsToShow.Count(), ItemsPerPage = PageSize },
    CurrentCategory = category
    };

    return View(viewModel);
    }
    可以看到,当用户首次请求List时,他很有可能没有给一个page参数(当然,在你的应用中你完全可以有你的选择),为此我们给了它一个默认的值。如果你用的不是C#4.0,那么你可以把int page = 1换成[DefaultValue(1)] int page,在这里它们的效果是一样的。

    接下来是对实现分页的整个过程的阐述:
    不管用户第一次请求是否带了page这个参数,在Action List执行过程中,Action List便会构造一个ProductsListViewModel对象,这个对象正是分页方法所需要的信息。当Action List顺利地执行完成return View(viewModel)时,视图List.aspx将收到Action List返回的viewModel并把它作为视图的Model属性。
    当视图List.aspx执行到<%: Html.PageLinks(Model.PagingInfo,i => Url.Action("List", new { category = Model.CurrentCategory, page = i }))%>时(视图得先在服务器上编译执行,产生最后的HTML才发送到客户端),它就会调用扩展方法Html.PageLinks()为每页生成一个唯一的<a>标签,这样也就作到了一页数据对应一个URL的良好用户体验。
    还需说明的一点是,这里的<a>标签导航到的可不是某个.aspx页面,而是某个Action(当然,本例中是Action List)。

    最后还有一处配置,就是增加一个Route项,形式如下:
    routes.MapRoute(
    null,
    "{category}/Page{page}",
    new { controller = "Products", action = "List" },
    new { page = @"\d+" });
    这样就做到了应你需求,无QueryString。。

    当然,如有需要,加上AJAX,用户将得到更好的体验。

  • 相关阅读:
    华硕笔记本无法U盘启动,快捷键识别不了
    怎么将uefi改成legacy启动|BIOS设置legacy引导模式的方法
    [CDLinux]制作U盘CDLinux系统启动盘
    重装系统时,将MBR分区转为GPT 分区
    5-Comments
    4-HTML Computer Code Elements
    3-html 缩写-地址-文字方向-引用块-题注的格式
    2-HTML Text Formatting Elements
    1-HTML Attributes
    LabVIEW--为设备添加配置文件.ini
  • 原文地址:https://www.cnblogs.com/Kingly/p/2871303.html
Copyright © 2020-2023  润新知