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の出力ウィンドウに出てるじゃん。
小さすぎて見えないね。
'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になるだけで、<% ~ %>はそのままのコードだもんね。 スッキリ。