ビューヘルパーを自作する

ビューヘルパーを自作する


【ビューヘルパーを自作する】

以下は例としてメールリンク要素を生成するビューヘルパーを作成
・プロジェクトフォルダ直下にでも適当にフォルダを作成して以下のビューヘルパーを定義したクラスを作成する。
※VBではstaticメソッドの代わりにShared Functionを使用(インスタンスを経由せずに直接使える)

・戻り値がStringではなくIHtmlStringであるのは、IHtmlStringが「HTMLエンコード済みの文字列」を表し、
 Razorが文字列をエンコードしないようにするため
・文字列をIHtmlString型に変換する為にMvcHtmlString.Createメソッドを使用
・HttpUtility.HtmlAttributeEncodeメソッドで各引数をエンコード処理する。
 
[作成したビューヘルパーを使用するビュー]

・ビューヘルパーを使用するためにはヘルパークラスが属する名前空間を@Imports でインポートする必要がある。
 (MvcBasicVBはルート名前空間)
arrow_down
[出力結果(HTML)]

【名前空間の登録】

Views\Web.configに名前空間を登録すれば@Imports でインポートする必要はなくなるがインテリセンスが
効かなくなるというデメリットがある。
[Web.config]

 

【拡張メソッドによる定義】

拡張メソッドとは、既にあるクラスに対して継承することなくメソッドだけを追加するしくみのこと。
.NET Framework3.5以降で利用できる。
以下の例は、拡張メソッドの仕組みを利用して、Htmlオブジェクト(HtmlHelperクラス)に対して
新しいImageTagメソッド(img要素を生成)を追加する。

※UrlHelper.GenerateContentUrlは、「~/…」のパスを絶対パスに変換するメソッド

拡張メソッドの基本構文について

・VBでは拡張メソッドはModuleの中に定義しなければならない。
・System.Runtime.CompilerServices.Extension()の属性を付加する必要がある。
・第一引数に拡張するクラスを指定する。 ※VBではthisは不要。
・拡張対象クラスのメンバーに対しては第一引数を経由してアクセス可能。
 
[作成した拡張メソッドを使用するビュー]

※拡張メソッドが属する名前空間を@Imports でインポートするかWeb.configに登録しておく必要がある。
※拡張メソッドに対してもインテリセンスは動作する
arrow_down
[出力結果(HTML)]

 

【TagBuilderクラスの活用】

TagBuilderクラスは、タグ文字列を生成する為のユーティリティクラス。
タグ文字列を組み立てる際に先ほどのString.Formatを使用した方法よりも便利。
・コンストラクターでタグ名を指定。
・MergeAttribute(単一)/MergeAttributes(複数)メソッドで属性を追加。
・ToStringでタグ文字列を出力。
以下の例は、video要素を生成する拡張メソッド

AnonymousObjectToHtmlAttributesメソッドは匿名型をIDictionary型に変換し、プロパティ名に含まれる
アンダースコア(_)をダッシュ(-)に変換するメソッド。
 
[作成した拡張メソッドを使用するビュー]

arrow_down
[出力結果(HTML)]

 

【Razor構文で作成するビューヘルパー】

ビューヘルパーは、@helper命令を使用することによりRazor構文で作成が可能。

@helper構文

@helper ヘルパー名(引数・・・)
  ヘルパー本体
End Helper
・戻り値はなし(ヘルパー本体で出力する内容を記述する)
・@helperメソッドの配下では標準のビューヘルパーは使用できない。
  
以下は先ほどのVideoヘルパーをRazor構文で定義した例
[App_Code/MyApp.vbhtml]

※作成したコードはプロジェクト直下のApp_CodeフォルダーにMyApp.vbhtml(なんでもいい)といったように
 Viewのファイル形式で配置する必要がある。
※RAZOR構文は、RAZOR構文を参照
 
上記で定義したVideoヘルパーを通常のビューにて呼び出します。
[作成したビューヘルパーを使用するビュー]

arrow_down
[出力結果(HTML)]

特定のビューのみで利用する場合、@helper命令はビュースクリプトの中に記述してもOK。
その場合、@~なしでビューヘルパー名のみで呼び出せる。
 

【インラインテンプレートの受け渡し】

インラインテンプレートとは、ヘルパーの引数として渡せるテンプレート。
引数で出力の形式を指定できる。

以下は、インラインテンプレートを扱うメソッド(HtmlHelperの拡張メソッド)の例 。
以下のビューヘルパー(TemplatedMessage)は、第2引数で指定した文字列を第1引数で指定した
テンプレートで整形する。

※引数としてFunc(Of T, HelperResult)型を受け取る。Tは、任意の型を指定できる。
 ちなみにFunc(Of T, HelperResult)型は、第1引数がT型で、戻り値がHelperResult型のデリーゲートを意味する。
 このデリゲートに対して、T型の引数(message)を渡すことでテンプレートに対して値が埋め込まれる。
 
[上記ビューヘルパーを使用するビュー]

ちなみに、C#では以下のように@~のような簡便な形でデリゲートの引数に渡せるらしいが、
VBでは無理だったので、@helperでインラインテンプレートを生成するビューヘルパーを作成してから、
そのビューヘルパー(f1)をラムダ式の形でデリゲートの引数に渡して実現する。

arrow_down
[出力結果(HTML)]