2

私は ASP.Net MVC を学んでおり、この本 Pro ASP.Net MVC4 by Adam Freeman を読んでいます。理解できないコードがあります。

 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 メソッドに渡していることを理解しています。

しかし、ビューまたはコントローラーでは、そのようなラムダ式は見られませんでした

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

あなたデリゲートを渡しています。ラムダ式は次のとおりです。

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 に答える