プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2018/07/20

ASP.NET Core の View 内でメソッドやヘルパーを定義する

event_note2018/07/20 6:39

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