ASP.NET Core のタグ ヘルパー
作成者: Rick Anderson
タグ ヘルパーとは
タグ ヘルパーを使うと、Razor ファイルでの HTML 要素の作成とレンダリングに、サーバー側コードを組み込むことができます。 たとえば、組み込みの ImageTagHelper
では、イメージ名にバージョン番号を追加することができます。 イメージが変更されるたびに、サーバーはイメージに対して新しい一意のバージョンを生成するため、クライアントは (キャッシュされた古いイメージではなく) 現在のイメージを確実に取得できます。 フォームやリンクの作成、資産の読み込みなど、一般的なタスクの組み込みのタグ ヘルパーは数多くあります。パブリック GitHub リポジトリで NuGet パッケージとして使用することもできます。 タグ ヘルパーは C# で作成され、要素名、属性名、または親タグに基づく HTML 要素をターゲットとします。 たとえば、LabelTagHelper
属性が適用されている場合、組み込みの LabelTagHelper
では HTML <label>
要素をターゲットとすることができます。 HTML ヘルパーに慣れている方は、タグ ヘルパーを使用すると、Razor ビューで HTML と C# の間の明示的な切り替えが減ることがわかります。 多くの場合、HTML ヘルパーでは特定のタグ ヘルパーの代替方法が提供されますが、タグ ヘルパーを HTML ヘルパーの代わりに使用することはできないことと、各 HTML ヘルパーに対応するタグ ヘルパーがないことを認識することが重要です。 2 つの違いの詳細については、「タグ ヘルパーと HTML ヘルパーの比較」を参照してください。
タグ ヘルパーは、コンポーネントでは Razor サポートされていません。 詳細については、「ASP.NET Core Razor コンポーネント」を参照してください。
タグ ヘルパーで提供されるもの
HTML 適した開発エクスペリエンス
ほとんどの場合、タグ ヘルパーを使用した Razor マークアップは標準の HTML のように見えます。 HTML、CSS、JavaScript に精通しいているフロントエンドのデザイナーは、C# Razor 構文を学習しなくても Razor を編集できます。
HTML と Razor マークアップを作成するための豊富な IntelliSense 環境
これは、Razor ビューのマークアップをサーバー側で作成する従来の手法である HTML ヘルパーとは非常に対象的です。 2 つの違いの詳細については、「タグ ヘルパーと HTML ヘルパーの比較」を参照してください。 IntelliSense 環境については、「Intellisense でのタグ ヘルパーのサポート」を参照してください。 Razor C# 構文に慣れている開発者であっても、C# Razor マークアップを記述するより、タグ ヘルパーを使用する方が生産性を高めることができます。
サーバーでのみ得られる情報を使用して、生産性を高め、より堅牢で信頼性の高い保守可能なコードを生成する方法
たとえば、画像の更新について、従来は画像を変更するときに画像の名前を変更する方法が繰り返されてきました。 パフォーマンス上の理由から、イメージを積極的にキャッシュする必要があり、イメージの名前を変更しない限り、クライアントが古いコピーを取得する危険性があります。 これまでは、イメージの編集後に、名前を変更する必要があり、Web アプリでのイメージへの各参照を更新する必要がありました。 これは非常に労力がかかるだけでなく、エラーが発生しやくなります (参照が見つからなかったり、誤って違う文字列を入力したりすることなどがあります)。組み込み ImageTagHelper
は、あなたの代わりにこれを自動的に行います。 ImageTagHelper
ではイメージ名にバージョン番号を追加できるため、イメージが変更されるたびに、サーバーはそのイメージに対して新しい一意のバージョンを自動的に生成します。 クライアントは現在のイメージを確実に取得できます。 ImageTagHelper
を使用することで、このような堅牢性と省力化を基本的に自由に実現できます。
ほとんどの組み込みタグ ヘルパーは、標準の HTML 要素をターゲットとし、要素に対してサーバー側の属性を提供します。 たとえば、Views/Account フォルダーの多くのビューで使用される <input>
要素には、asp-for
属性が含まれて この属性は、指定されたモデル プロパティの名前をレンダリングされる HTML に抽出します 次のモデルの Razor ビューについて考えてみましょう。
public class Movie
{
public int ID { get; set; }
public string Title { get; set; }
public DateTime ReleaseDate { get; set; }
public string Genre { get; set; }
public decimal Price { get; set; }
}
Razor マークアップは次のとおりです。
<label asp-for="Movie.Title"></label>
次の HTML が生成されます。
<label for="Movie_Title">Title</label>
asp-for
属性は、LabelTagHelper の For
プロパティで使用できます。 詳しくは、タグ ヘルパーの作成に関するページをご覧ください。
タグ ヘルパーのスコープの管理
タグ ヘルパーのスコープは、@addTagHelper
、@removeTagHelper
、"!" オプトアウト文字の組み合わせによって制御されます。
@addTagHelper
でタグ ヘルパーを使用可能にする
AuthoringTagHelpers という名前の新しい ASP.NET Core Web アプリを作成すると、次Views/_ViewImports.cshtml
のファイルがプロジェクトに追加されます。
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, AuthoringTagHelpers
@addTagHelper
ディレクティブにより、ビューでタグ ヘルパーが使用可能になります。 この場合、ビュー ファイルは Pages/_ViewImports.cshtml
であり、既定では Pages フォルダーとサブフォルダー内のすべてのファイルによって継承され、タグ ヘルパーを使用できるようになります。 上記のコードでは、ワイルドカード構文 ("*") を使用して、指定したアセンブリ (Microsoft.AspNetCore.Mvc.TagHelpers) 内のすべてのタグ ヘルパーを Views ディレクトリまたはサブディレクトリ内のすべてのビュー ファイルで使用できるように指定します。 の後 @addTagHelper
の最初のパラメーターは、読み込むタグ ヘルパーを指定し (すべてのタグ ヘルパーに "*" を使用しています)、2 番目のパラメーター "Microsoft.AspNetCore.Mvc.TagHelpers" はタグ ヘルパーを含むアセンブリを指定します。 Microsoft.AspNetCore.Mvc.TagHelpers は、組み込み ASP.NET Core タグ ヘルパーのアセンブリです。
すべてのタグ ヘルパーをこのプロジェクト (AuthoringTagHelpers という名前のアセンブリを作成する) で公開するには、以下を使用します。
@using AuthoringTagHelpers
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, AuthoringTagHelpers
プロジェクトに既定の名前空間がある EmailTagHelper
が含まれている場合は (AuthoringTagHelpers.TagHelpers.EmailTagHelper
)、タグ ヘルパーの完全修飾名 (FQN) を指定できます。
@using AuthoringTagHelpers
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper AuthoringTagHelpers.TagHelpers.EmailTagHelper, AuthoringTagHelpers
FQN を使用してビューにタグ ヘルパーを追加するには、最初に FQN (AuthoringTagHelpers.TagHelpers.EmailTagHelper
) を追加してから、アセンブリ名 (AuthoringTagHelpers) を追加します。 ほとんどの開発者は、"*" ワイルドカード構文を使用することを好みます。 ワイルドカード構文を使用すると、ワイルドカード文字 "*" をサフィックスとして FQN に挿入できます。 たとえば、以下のディレクティブのいずれかで EmailTagHelper
を取り込みます。
@addTagHelper AuthoringTagHelpers.TagHelpers.E*, AuthoringTagHelpers
@addTagHelper AuthoringTagHelpers.TagHelpers.Email*, AuthoringTagHelpers
前述のように、 ディレクティブを @addTagHelper
ファイルに Views/_ViewImports.cshtml
追加すると、 Views ディレクトリとサブディレクトリ内のすべてのビュー ファイルでタグ ヘルパーを使用できるようになります。 これらのビューにのみタグ ヘルパーを公開することを選択する場合は、特定のビュー ファイルで @addTagHelper
ディレクティブを使用できます。
@removeTagHelper
でタグ ヘルパーを削除する
@removeTagHelper
には @addTagHelper
と同じ 2 つのパラメーターがあり、以前に追加されたタグ ヘルパーを削除します。 たとえば、特定のビューに適用された @removeTagHelper
では、指定されたタグ ヘルパーをビューから削除します。 ファイルで をViews/Folder/_ViewImports.cshtml
使用すると@removeTagHelper
、指定したタグ ヘルパーが Folder 内のすべてのビューから削除されます。
ファイルを使用したタグ ヘルパー スコープの _ViewImports.cshtml
制御
任意の _ViewImports.cshtml
ビュー フォルダーに を追加できます。ビュー エンジンは、そのファイルとファイルの両方から ディレクティブを Views/_ViewImports.cshtml
適用します。 ビューに空 Views/Home/_ViewImports.cshtml
のファイルを追加した Home 場合、ファイルは追加されているため _ViewImports.cshtml
、変更はありません。 @addTagHelper
ファイルに追加するViews/Home/_ViewImports.cshtml
ディレクティブ (既定Views/_ViewImports.cshtml
のファイルに含まれていない) は、これらのタグ ヘルパーをフォルダー内のHomeビューにのみ公開します。
個々の要素の無効化
タグ ヘルパーのオプトアウト文字 ("!") を使用して、要素レベルでタグ ヘルパーを無効にすることができます。 たとえば、Email
検証は、タグ ヘルパーのオプトアウト文字を使用して <span>
で無効にすることができます。
<!span asp-validation-for="Email" class="text-danger"></!span>
開始タグと終了タグにタグ ヘルパーのオプトアウト文字を適用する必要があります (Visual Studio エディターでは、ユーザーがオプトアウト文字を開始タグに追加すると、自動的にオプトアウト文字が終了タグに追加されます)。 オプトアウト文字を追加した後、要素とタグ ヘルパーの属性は独特なフォントで表示されなくなります。
@tagHelperPrefix
を使用してタグ ヘルパーの使用状況を明確にする
@tagHelperPrefix
ディレクティブでは、タグ プレフィックス文字列を指定して、タグ ヘルパーのサポートを有効にしたり、タグ ヘルパーの使用状況を明確にすることができます。 たとえば、次のマークアップをファイルに Views/_ViewImports.cshtml
追加できます。
@tagHelperPrefix th:
以下のコード イメージでは、タグ ヘルパーのプレフィックスが th:
に設定されているため、プレフィックス th:
を使用する要素のみでタグ ヘルパーがサポートされます (タグ ヘルパーが有効な要素には独特なフォントがあります)。 <label>
要素と <input>
要素にはタグ ヘルパー プレフィックスがあり、タグ ヘルパーが有効ですが、<span>
要素にはありません。
@addTagHelper
に適用されるものと同じ階層規則が @tagHelperPrefix
にも適用されます。
自己終了タグ ヘルパー
多くのタグ ヘルパーは、自己終了タグとして使用できません。 一部のタグ ヘルパーは、自己終了タグとして設計されています。 自己終了するようになっていないタグ ヘルパーを使用すると、表示される出力が抑制されます。 タグ ヘルパーを自己終了すると、表示される出力の中に自己終了タグが配置されます。 詳細については、タグ ヘルパーの作成に関するページのこちらの注意をご覧ください。
タグ ヘルパーの属性/宣言内の C#
タグ ヘルパーでは要素の属性またはタグ宣言区分の C# は許可されません。 たとえば、次のようなコードは有効ではありません。
<input asp-for="LastName"
@(Model?.LicenseId == null ? "disabled" : string.Empty) />
上記のコードは、次のように記述できます。
<input asp-for="LastName"
disabled="@(Model?.LicenseId == null)" />
通常、 演算子は @
、レンダリングされた HTML マークアップに式のテキスト表現を挿入します。 ただし、式が論理 false
に評価されると、フレームワークは代わりに 属性を削除します。 前の例では、 disabled
または が の場合Model
、 属性は にtrue
設定されますnull
LicenseId
。
タグ ヘルパー初期化子
属性はタグ ヘルパーの個々のインスタンスを構成するために使用できますが、 ITagHelperInitializer<TTagHelper> 特定の種類のすべてのタグ ヘルパー インスタンスを構成するために使用できます。 アプリ内のすべてのインスタンスの 属性またはAppendVersion
プロパティをasp-append-version
構成するタグ ヘルパー初期化子の次のScriptTagHelper
例を考えてみましょう。
public class AppendVersionTagHelperInitializer : ITagHelperInitializer<ScriptTagHelper>
{
public void Initialize(ScriptTagHelper helper, ViewContext context)
{
helper.AppendVersion = true;
}
}
初期化子を使用するには、アプリケーションのスタートアップの一部として登録して初期化子を構成します。
builder.Services.AddSingleton
<ITagHelperInitializer<ScriptTagHelper>, AppendVersionTagHelperInitializer>();
wwwroot の外部でのタグ ヘルパーの自動バージョン生成
外部wwwroot
の静的ファイルのバージョンを生成するタグ ヘルパーについては、「複数の場所からファイルを提供する」を参照してください。
Intellisense でのタグ ヘルパーのサポート
HTML <label>
要素を書き込むことを検討してください。 Visual Studio エディターで <l
を入力するとすぐに、IntelliSense で一致する要素が表示されます。
HTML のヘルプだけでなく、アイコン (下に "" がある "<>@" 記号) も表示されます。
このアイコンは、タグ ヘルパーのターゲットとなる要素を示します。 純粋な HTML 要素 (など) には fieldset
、"<>" アイコンが表示されます。
純粋な HTML <label>
タグの場合、HTML タグ (既定の Visual Studio の配色テーマ) が茶色のフォントで、属性が赤で、属性値が青で表示されます。
<label
を入力した後、IntelliSense では次のように使用可能な HTML/CSS 属性とタグ ヘルパーのターゲットとなる属性がリストされます。
IntelliSense ステートメント入力候補では、Tab キーを入力して、選択した値を使用してステートメントを完了することができます。
タグ ヘルパー属性が入力されるとすぐに、タグと属性のフォントが変わります。 既定の Visual Studio の "青" または "ライト" の配色テーマを使用すると、フォントが太字の紫になります。 "ダーク" テーマを使用する場合、フォントは太字の青緑になります。 このドキュメントのイメージは、既定のテーマを使用して取得されたものです。
Visual Studio CompleteWord ショートカット (Ctrl + space キーが 既定値) を二重引用符 ("") 内に入力できます。C# クラスの場合と同様に、C# に入ります。 IntelliSense では、ページ モデルですべてのメソッドとプロパティが表示されます。 プロパティの種類が ModelExpression
であるため、メソッドとプロパティを使用できます。 次のイメージでは、Register
ビューを編集するため、RegisterViewModel
を使用できます。
IntelliSense では、ページのモデルで使用可能なプロパティとメソッドがリストされます。 豊富な IntelliSense 環境は、CSS クラスを選択する場合に役立ちます。
タグ ヘルパーと HTML ヘルパーの比較
タグ ヘルパーは Razor ビューで HTML 要素にアタッチされますが、HTML ヘルパーは Razor ビューで HTML に点在するメソッドとして呼び出されます。 たとえば、CSS クラス "caption" を指定して HTML ラベルを作成する、次のような Razor マークアップがあるとします。
@Html.Label("FirstName", "First Name:", new {@class="caption"})
アットマーク (@
) 記号は、Razor で、それコードの先頭であることを示します。 次の 2 つのパラメーター ("FirstName" と "First Name:") は文字列であるため、IntelliSense では対応できません。 以下が最後の引数です。
new {@class="caption"}
これは属性を表すために使用される匿名オブジェクトです。 class
は C# の予約済みのキーワードであるため、@
シンボルを使用して、C# で強制的に @class=
をシンボル (プロパティ名) として解釈するようにします。 フロント エンドのデザイナー (HTML/CSS/JavaScript とその他のクライアント テクノロジを熟知しているが、C# や Razor は使い慣れていない方) には、ほとんどの行が見慣れないものでしょう。 IntelliSense に頼らずに行全体を作成する必要があります。
LabelTagHelper
を使用すれば、以下と同じマークアップを書き込むことができます。
<label class="caption" asp-for="FirstName"></label>
タグ ヘルパー バージョンを使用して Visual Studio エディターで <l
を入力するとすぐに、IntelliSense で一致する要素が表示されます。
IntelliSense は行全体を書き込む場合に役立ちます。
次のコード画像は、Visual Studio に含まれる ASP.NET 4.5.x MVC テンプレートから生成されたビューの Form 部分 Views/Account/Register.cshtml
Razor を示しています。
Visual Studio エディターでは、背景が灰色の C# コードが表示されます。 たとえば、次の AntiForgeryToken
HTML ヘルパーの場合、
@Html.AntiForgeryToken()
灰色の背景で表示されます。 Register ビューのマークアップのほとんどは C# です。 以下のタグ ヘルパーを使用する同じ方法と比較します。
HTML ヘルパーの方法よりも、マークアップがわかりやすく、読み取り、編集、保持が簡単になります。 C# コードは、サーバーで認識する必要がある最低限まで減っています。 Visual Studio エディターでは、独特なフォントでタグ ヘルパーのターゲットとなるマークアップが表示されます。
たとえば、以下の Email グループについて考えてみます。
<div class="form-group">
<label asp-for="Email" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="Email" class="form-control" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
</div>
"asp-" 属性にはそれぞれ "Email" の値がありますが、"Email" は文字列ではありません。 このコンテキストでは、"Email" は RegisterViewModel
の C# モデル式のプロパティとなります。
Visual Studio エディターは登録フォームのタグ ヘルパーの方法ですべてのマークアップを書き込む場合に役立ちますが、Visual Studio は HTML ヘルパーの方法ではほとんどのコードに対応できません。 Visual Studio エディターでのタグ ヘルパーの操作の詳細については、「IntelliSense でのタグ ヘルパーのサポート」を参照してください。
タグ ヘルパーと Web サーバー コントロールの比較
タグ ヘルパーには関連付けられている要素はなく、要素とコンテンツのレンダリングに参加するだけです。 ASP.NET Web サーバー コントロールはページで宣言され、呼び出されます。
ASP.NET Web サーバー コントロールには複雑なライフサイクルがあり、これが開発とデバッグを困難にする場合があります。
Web サーバー コントロールではクライアント コントロールを使用して、クライアントのドキュメント オブジェクト モデル (DOM) 要素に機能を追加することができます。 タグ ヘルパーには DOM がありません。
Web サーバー コントロールには自動ブラウザー検出が含まれます。 タグ ヘルパーではブラウザーが認識されません。
通常、Web サーバー コントロールを作成することはできませんが、複数のタグ ヘルパーは同じ要素に対して動作できます ( 「タグ ヘルパーの競合の回避」を参照)。
タグ ヘルパーではスコープとなる HTML 要素のタグとコンテンツを変更できますが、ページ上の他のものを直接変更しません。 Web サーバー コントロールではスコープが限定されないため、ページの他の部分に影響を与えるアクションを実行して、予想外の結果となる場合があります。
Web サーバー コントロールでは型コンバーターを使用して、文字列をオブジェクトに変換します。 タグ ヘルパーの場合、C# でネイティブに作業するため、型を変換する必要はありません。
Web サーバー コントロールは、 を使用 System.ComponentModel して、コンポーネントとコントロールの実行時およびデザイン時の動作を実装します。
System.ComponentModel
には、属性と型コンバーターの実装、データ ソースへのバインド、コンポーネントのライセンス処理のための基底クラスと基底インターフェイスが含まれています。 通常はTagHelper
から派生するタグ ヘルパーとは異なり、TagHelper
基底クラスではProcess
とProcessAsync
の 2 つのメソッドのみを公開します。
タグ ヘルパー要素のフォントのカスタマイズ
次のように、 [ツール]>[オプション]>[環境]>[フォントおよび色] からフォントと色づけをカスタマイズすることができます。
組み込みの ASP.NET コア
その他の技術情報
- タグ ヘルパーの作成
- フォームの操作
- GitHub の TagHelperSamples には、ブートストラップを操作するためのタグ ヘルパーのサンプルが含まれています。