我正在学习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;
感谢您的指导。 问候, 哈利
答案 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等