WebMatrix + ASP.NET Web Pages でキレイにコーディングしたい(3)
だるさん、Razor には @functions って記法もあるんやで
— しばやん (@shibayan) 2012年8月8日
知ってたさ! でも、なんか Func<> ってカッコいいから使ってみたかったんだよ!*1
@functions
というわけで、レイアウトファイルで @functions を使ってみた。
<!DOCTYPE html> <html lang="@App.Language"> <head> : : <div id="site-content"> <article id="site-body"> @RenderBody() </article> <aside id="site-sidebar"> @RenderSideBar() </aside> </div> <footer id="site-footer"> @RenderFooter() </footer> </body> </html> @functions { public HelperResult RenderHeader() { return RenderPage("_Header.cshtml"); } public HelperResult RenderNavigation() { return RenderPage("_Navigation.cshtml"); } public HelperResult RenderSideBar() { return RenderPage("_SideBar.cshtml"); } public HelperResult RenderFooter() { return RenderPage("_Footer.cshtml"); } }
@functions{……} を使う利点はいくつかあるけど、
とりあえず今のところ単純なラムダ式でなんとかなっているけれど、たとえばRenderFooter でエラー処理を追加する場合(“_Footer.cshtml”がない場合がありえる)を考えると、「レイアウトファイルを簡潔にしたい」という目的からはだいぶ外れてくる。
WebMatrix + ASP.NET Web Pages でキレイにコーディングしたい(2) - だるろぐ
という懸念はないね。ながながとラムダ式を書くのはアレだけれど、一般的な関数ならばまぁ、いいや。あと、冒頭じゃなくて末尾に書けるのも何気に美味しい。レイアウトファイルのメインはあくまでも HTML ファイルだと思うし、ユーティリティ関数みたいなのは隅っこに書いておきたいって思う。 @{……} セクションで宣言した変数だと使う前に宣言しておかないとダメみたいだけれど、 @functions{……} で宣言した関数はあとで宣言してもいいみたいだ。
Visual Studio のツールチップでみてみたのだけれど、何がなんだかよくわかんないね。なんなんだろう、このテンポラリクラスは。こうなってくると、ちょっと中身を知りたくなってくる。あと、テンポラリクラス名でわかるかもしれないけれど、テーマ機能もつけてみた。
今見返してふと思ったのは、比較的簡単にテーマ機能なんかを実装できるなということ。ただデザインを変えたいがために、毎回一からこんなの作るのはアホらしい。
WebMatrix + ASP.NET Web Pages でキレイにコーディングしたい - だるろぐ
その話はまた今度するかもしれないし、しないかもしれない。
ちなみに、このコーナーはあくまでも自分の試行錯誤を書いてみただけで、このやり方が正しいというわけでは決してないので注意してください。
*1:忘れてた