2009年2月4日水曜日

ASP.NET MVCでLambda使ったRepeaterヘルパー

Bug squash: Repeater with separator for ASP.NET MVC

やってることは、Actionデリゲートを受け取るRepeaterヘルパーを書いて、その中でイテレータでデータを取り出して、Actionデリゲート(アイテム描画と区切り描画)を実行するものだけど、初回実行と2回目以降の描画を判定するイテレータの書き方がオシャレ。

1.itemsをSelectでアイテム描画FuncのIEnumerableに変換。 2.Intersperseで最初のイテレータなら、アイテム描画のFuncをyield return、2回目以降は区切り描画Funcをyield return後アイテム描画Funcをyield returnで新たなIEnumerableに変換。 3.最後に、2のFuncのIEnumerableをSelectして実行させる。

元はPhilさんの↓このエントリー。

Code Based Repeater for ASP.NET MVC

ちょっと、古いじゃないですか!と、思うところですが、気になったんですよね。 そういえば、このLambda(Actionデリゲート)には何が渡されてるんだ?と。 WebFormViewEngineなんだから、aspxをc#(VB.NETかもしれないけど)に変換してるのは分かるけど、そういえば最近変換内容を確認してないな~、なんて。

  <p>
 <% Html.Repeat(new []{"ルフィー","ゾロ","ウソップ"}, val => {%>
   <% = Html.Encode(val)%>
 <% }, ()=>{ %>
   <br />
 <% }); %>
 </p>

↑こんな感じで書いたときに、どういうcsが出力されてるのか。 WebDev.WebServerで動かしてる時って、どこにいるんだべか。 悩む必要なんか無いことに気がついた。VSの出力ウィンドウに出てるじゃん。

img.aspx

小さすぎて見えないね。

'WebDev.WebServer.EXE' (マネージ): 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\c83bad6c\726bdcee\App_Web_index.aspx.a8d08dba.52iuaodz.dll' が読み込まれました。シンボルが読み込まれました。

↑こう。 ってことで、上記フォルダを見てみる。それっぽい拡張子csのファイルを開く。 コメントが多いから消したのが↓これ。

            @__w.Write("\r\n  <p>\r\n  ");
    Html.Repeat(new []{"ルフィー","ゾロ","ウソップ"}, val => {
           @__w.Write( Html.Encode(val));
           @__w.Write("\r\n  ");
    }, ()=>{
           @__w.Write("\r\n    <br />\r\n  ");
    });
           @__w.Write("\r\n  </p>\r\n\r\n");

※@__writeはHtmlTextWriter。

そっか。普通に<%= ~ %>はHtmlTextWriter.Writeになるだけで、<% ~ %>はそのままのコードだもんね。 スッキリ。