1. ホーム
  2. asp.net-mvc

[解決済み] Razorで汎用的な@helperメソッドを作成することはできますか?

2023-03-19 10:49:34

質問

Razorで以下のようなヘルパーを書こうとしています。

@helper DoSomething<T, U>(Expression<Func<T, U>> expr) where T : class

残念ながら、パーサは <T が HTML 要素の始まりであるとパーサーが判断してしまい、シンタックスエラーが発生してしまいます。 Razorでジェネリックメソッドであるヘルパーを作ることは可能でしょうか? もしそうなら、どのような構文になるのでしょうか?

どのように解決するのですか?

いいえ、現在のところ不可能です。代わりに通常のHTMLヘルパーを書くことができます。

public static MvcHtmlString DoSomething<T, U>(
    this HtmlHelper htmlHelper, 
    Expression<Func<T, U>> expr
) where T : class
{
    ...
}

として、その後に

@(Html.DoSomething<SomeModel, string>(x => x.SomeProperty))

または、総称の第一引数としてモデルを対象にしている場合。

public static MvcHtmlString DoSomething<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expr
) where TModel : class
{
    ...
}

で、このように呼び出すことができます(もちろん、ビューが強く型付けされていることが前提ですが、すべてのビューがとにかく強く型付けされるべきなので、これは安全な仮定です :-) )。

@Html.DoSomething(x => x.SomeProperty)