ASP.NET Core において、View の処理を共通化するために、Razor 内にちょっとしたメソッドやヘルパーを定義したいことがあります。
尚、ASP.NET MVC であった @helper
は ASP.NET Core では削除されたようです。
環境
- Visual Studio 2017
- ASP.NET Core 2.1
メソッドの定義する簡単な例
メソッドの定義
@functions
を使用します。
@functions{
string GetString(int x)
{
if (x == 0)
{
return "foo";
}
else
{
return "bar";
}
}
}
使用方法
<ul>
<li>@GetString(0)</li>
<li>@GetString(1)</li>
</ul>
結果
foo
bar
ヘルパーを定義する簡単な例
ちょっとした処理なら上記で良いのですが、ヘルパーだと HTML を直に出力できるので、HTML をたくさん出力する場合にはこちらのほうが楽です。
ヘルパーの定義
例えば以下のように定義します。
@{
Func<int, IHtmlContent> sample1 = @<span>Sample1</span>;
Func<int, IHtmlContent> sample2 = @<text>
@if (item == 0)
{
<span>foo</span>
}
else
{
<span>bar</span>
}
</text>;
}
@
で始まり、;
で終わるようです。@
の後はタグでなければエラーになりました。
引数へのアクセスには @item
を使用します。
引数の数は1つにしなければならないようです。
引数をなしにしたり、2つ以上にしてデリゲートを定義するとエラーになりました。
使用方法
<ul>
<li>@sample1(0)</li>
<li>@sample2(0)</li>
<li>@sample2(1)</li>
</ul>
結果
Sample1
foo
bar
ヘルパーの引数に DTO を使用する例
より多くの値をヘルパーに渡したい場合は DTO を定義します。
定義の仕方
@using Microsoft.AspNetCore.Html
@functions {
class Dto
{
public string Data { get; set; }
}
}
@{
Func<Dto, IHtmlContent> sample = @<span>@item.Data</span>;
}
使用方法
<ul>
<li>@sample(new Dto { Data = "foo" })</li>
<li>@sample(new Dto { Data = "bar" })</li>
</ul>
結果
foo
bar