用于页面链接创建的HTML帮助程序 - 试图理解

时间:2012-07-24 15:14:58

标签: c# asp.net-mvc-3 html-helper

以下是我的HTML帮助文件(PageHelper.cs)的完整源代码,它完美无缺。我正在学习ASP.NET MVC 3并使用aPress的“Pro ASP.NET MVC 3 Framework”一书。我喜欢这本书的流程,并且我学到了很多东西,但是它时不时地提供工作代码而没有真正解释为什么它有效,这就是这些例子中的一个。我在Google和Stack上花了相当多的时间。现在就明白......

我希望有人可以解释'public static MvcHtmlString PageLinks'中发生的事情的流程。我正在努力学习这一点而不是简单地按照书中的说法进行操作(注意:代码中的过多注释是我自己的 - 旨在加强学习)。

我对它的看法是 MvcHtmlString 用于告诉浏览器不要再次重新编码HTML,因为生成的HTML已经存在。 用于捕获用户当前所在的页面。 html HtmlHelper 类的实例化? (虽然 html 再也没有提到 - 为什么会这样?)。 pagingInfo 是我的 PagingInfo 类的实例化,它包含返回的HTML创建中使用的属性。这部分我根本无法解开...... Func 部分。本书解释了 Func 参数提供了传递委托的能力,该委托将用于生成链接以查看其他页面 - 不确定这意味着什么以及为什么需要功能路由。

我可以遵循的其余代码。对于冗长的帖子感到抱歉,但我正在寻求清晰。如果我的任何代码注释或解释不正确,请纠正我。提前谢谢!

using System;
using System.Text;
using System.Web.Mvc;
using SportsStore.WebUI.Models;

//You use HTML helpers in a view to render HTML content. An HTML helper, in most 
//cases, is just a method that returns a string.  You can build an entire ASP.NET
//MVC application without using a single HTML helper. However, HTML helpers make 
//your life as a developer easier. By taking advantage of helpers, you can build
//your views with far less work.  Write once, reuse often.  

//We use 'MvcHtmlString' so that the result doesn't get re-encoded in the view. 
//It is part of the MVC framework and when you create your own HTML helper
//methods like this one, always use it.

namespace SportsStore.WebUI.HtmlHelpers
{
    //This is public so it can be accessed in other areas, however the 'static'
    //means it can't be instantiated.
    public static class PagingHelpers
    {
        //This is an HTML Helper method that we call 'PageLinks', which generates
        //HTML for a set of page links using the info provided in a PagingInfo
        //object.  Remember that extension methods are only available for use
        //when the namespace that contains it is in scope.  In a code file, this
        //is done with a 'using' statement, but for a Razor view, we must add a 
        //configuration entry to the View-specific Web.config file OR add a
        //'@using' statement to the view itself.  For this project we chose to 
        //use the Web.config file to keep the View less cluttered.

        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());
        }
    }
}

2 个答案:

答案 0 :(得分:1)

内置HTML帮助程序,在本章中,作者为分页创建了一个自定义的PageLinks() HTML帮助程序。如您所见,helper类返回一个用于构建HTML <a>标记链接的字符串。 PagingInfo模型使用此静态助手类。

每次用户点击页码时,都会将PagingInfo作为currentPage参数值传递给PagingInfo。然后,只要在此视图模型上建模视图(例如view model class ProductListViewModel),作者就会在List.cshtml中实例化@Html.PageLinks对象。

在视图中,调用<a>以显示PageLinks辅助方法构建的{{1}}标记链接。

我希望这会有所帮助。如果您想了解有关HTML帮助程序扩展方法的更多信息,请阅读

  

“创建简单数据输入应用程序”下的第2章

  

“自定义HTML助手”第19章

答案 1 :(得分:0)

我在学习MVC 3时只是从同一本书中编写这段代码所以我在网上偶然发现了你的问题。

您需要了解EXTENSION METHODS的内容:

这就是为什么你需要“ this ”,这是一个规则,当你用新方法扩展一个类时,第一个参数总是类的类类型你希望扩展,之前是“this”。

所以,在我们的好书中,我们有这个HtmlHelper html (这类 - 类型 - 类引用)

希望我帮助你,如果不问你没有得到什么。