Func <int,string>从Url.Action </int,string>返回

时间:2013-06-23 08:08:06

标签: c# asp.net-mvc razor

我正在学习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方法。

但是在View或控制器中,我没有看到任何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;

感谢您的指导。 问候, 哈利

2 个答案:

答案 0 :(得分:4)

正在传递委托。 lambda表达式在这里:

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

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

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

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

答案 1 :(得分: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等

相关问题