c# - Func<int,string> 从 Url.Action 返回

标签 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)

我知道它将委托(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/

相关文章:

asp.net-mvc - 如何使用 RAZOR 在 MVC 中解码 HTML

具有 2 个操作的单行 if 语句的 C# 编译器错误

c# - 丢弃方法的所有参数(删除未使用的参数 'sender' 和 'args' )

c# - 实例字段的初始化与局部变量

c# - 为什么我的类没有暴露给同一命名空间中的对等类?

c# - 从 ASP.NET MVC 项目中的 C# 代码隐藏向另一个网站发送 JSON 请求

javascript - 通过 javascript 从 http 页面调用同一站点的 https url 时出现 "Access-Control-Allow-Origin"问题

javascript - .datepicker() 函数在第二次单击时起作用

c# - 限制 View 中的内联代码具有与模型相关的代码以外的代码

c# - 如何在 Visual Studio 2010 和 .NET 4.0 中使用异步?