2

我正在学习 ASP.Net MVC 并阅读了 Adam Freeman 的这本书 Pro ASP.Net MVC4,有一些我不明白的代码。

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

在单元测试项目中,我看到了代码:

Func<int, string> pageUrlDelegate = i => "Page" + i;
MvcHtmlString result = myHelper.PageLinks(pagingInfo, pageUrlDelegate)

我知道它将委托传递给 PageLinks 方法。

但是在视图或控制器中,我没有看到任何这样的 lambda 表达式

Func<int, string> pageUrlDelegate = i => "Page" + i;

视图代码为:

 <div class="pager">
   @Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new {page = x}))
  </div>

执行时,它如何生成如下 HTML 用于分页:

<div class="pager">
   <a class="selected" href="/">1</a><a href="/**Page2**">2</a>
      <a href="/Page3">3</a>
</div>

它如何在方法扩展中生成“Page{number}”,而我们没有传递任何委托,例如在视图中:

 Func<int, string> pageUrlDelegate = i => "Page" + i;

谢谢你的指导。问候,哈利

4

2 回答 2

4

正在传递一个代表。lambda 表达式在这里:

x => Url.Action("List", new {page = x})

你没有将它声明为一个单独的变量,但这没什么特别的——你可以在你的单元测试中做同样的事情:

MvcHtmlString result = myHelper.PageLinks(pagingInfo, i => "Page" + i)

在这两种情况下,您都在创建一个Func<int, string>- 只是“真实”应用程序中的委托调用Url.Action以从名称和匿名类型的实例创建字符串。

于 2013-06-23T08:21:32.800 回答
0

我有同样的问题,花了几个小时搜索答案。因此,您的问题“它如何在方法扩展中生成 'Page{number}'”的答案在于文件 SportsStore.WebUI/App_Start/RouteConfig.cs。您可以打开它并观看代码:

routes.MapRoute(
        name: null,
        url: "Page{page}",
        defaults: new { Controller = "Product", action = "List" }
      );
这行代码
url: "Page{page}",
生成Page1、Page2等。

于 2014-02-14T07:44:06.153 回答