我正在学习 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)
我知道它将委托(delegate)传递给 PageLinks 方法。
但是在 View 或 Controller 中,我没有看到任何这样的 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>
当我们没有传递任何委托(delegate)(例如在 View 中)时,它如何在方法扩展中生成“Page{number}”:
Func<int, string> pageUrlDelegate = i => "Page" + i;
谢谢您的指导。 问候, 哈利
最佳答案
您正在传递一个委托(delegate)。 lambda 表达式在这里:
x => Url.Action("List", new {page = x})
您没有将其声明为单独的变量,但这没什么特别的 - 您可以在单元测试中执行相同的操作:
MvcHtmlString result = myHelper.PageLinks(pagingInfo, i => "Page" + i)
在这两种情况下,您都会创建 Func<int, string>
- 只是“真实”应用程序中的委托(delegate)调用 Url.Action
从名称和匿名类型的实例创建字符串。
关于c# - Func<int,string> 从 Url.Action 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17258809/