2

下面是我的 HTML 帮助文件 (PageHelper.cs) 的完整源代码,它运行良好。我正在学习 ASP.NET MVC 3 并使用 aPress 的“Pro ASP.NET MVC 3 Framework”一书。我喜欢这本书的流程,并且学到了很多东西,但是它时不时地提供工作代码,但没有真正解释它为什么工作,这就是这些例子之一。我在 Google 和 Stack 上花费了相当多的时间。现在要进入正题...

我希望有人可以解释“公共静态 MvcHtmlString PageLinks”中发生的事情的流程。我正在尝试学习这一点,而不是简单地按照书中的内容进行学习(注意:代码中的过多注释是我自己的 - 旨在加强学习)。

我的看法是MvcHtmlString用于告诉浏览器不要重新编码 HTML,因为生成的 HTML 已经是。 用于捕获用户当前所在的页面。 htmlHtmlHelper类的实例化吗?(虽然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());
        }
    }
}
4

2 回答 2

1

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

每次用户单击页码时,它都会PagingInfo作为currentPage参数值传递给。然后,每当视图(例如)基于此视图模型建模时,作者都会在 中实例化一个PagingInfo对象。view model class ProductListViewModelList.cshtml

在视图上,调用@Html.PageLinks以显示由辅助方法<a>构建的标记链接。PageLinks

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

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

第 19 章“自定义 HTML 助手”

于 2013-11-02T20:13:52.687 回答
0

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

您需要了解什么是扩展方法

这就是你需要“ this ”的原因,这是一条规则,当你使用新方法扩展一个类时,第一个参数始终是你想要扩展的类的类类型,前面是“this”。

所以,在我们伟大的书中,我们有这个 HtmlHelper html(这个 - 类类型 - 类参考)

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

于 2012-10-15T10:09:30.973 回答