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

[解決済み] Razorの宣言型ビューからMVC HtmlHelperの拡張機能を利用する

2022-08-10 20:01:57

質問

MVC 3 RTMプロジェクトのApp_CodeフォルダにRazorのdeclarativeヘルパーを作成しようとしています。

私が遭遇した問題は、ActionLink のような MVC HtmlHelper の拡張が利用できないことでした。これは、コンパイルされたヘルパーが System.Web.WebPages.HelperPage に由来するものであり、それは Html プロパティを公開していますが、その型は System.Web.WebPages.HtmlHelper よりも System.Web.Mvc.HtmlHelper .

どのようなエラーが発生したかの例としては

'System.Web.Mvc.HtmlHelper' は 'ActionLink' の定義を含んでいません。 ActionLink' の定義が含まれていません。 および拡張メソッド 'ActionLink' がありません。 型の最初の引数を受け入れる拡張メソッド 'System.Web.Mvc.HtmlHelper' の最初の引数を受け入れる拡張メソッド 'ActionLink' は見つかりませんでした。 が見つかりませんでした (using ディレクティブまたはアセンブリ参照が不足しているのでしょうか?)

私の唯一の解決策は、独自のHelperPageを作成し、Htmlプロパティをオーバーライドすることでした。

using System.Web.WebPages;

public class HelperPage : System.Web.WebPages.HelperPage 
{
    // Workaround - exposes the MVC HtmlHelper instead of the normal helper
    public static new HtmlHelper Html
    {
        get { return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html; }
    }
}

それから、すべてのヘルパーの先頭に次のように書く必要があります。

@inherits FunnelWeb.Web.App_Code.HelperPage
@using System.Web.Mvc
@using System.Web.Mvc.Html

@helper DoSomething()
{
    @Html.ActionLink("Index", "Home")
}

MVC 3ではこんなに難しいのでしょうか、それとも私が何か間違ったことをしているのでしょうか?

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

を見てみましょう。 Marcind の回答 をご覧ください。あなたが経験していることは、宣言的なビューを App_Code フォルダーに置くことの制限です。

ヘルパーをApp_Codeに置くことは有効です。 しかし、特定の制限事項があります。 ある種のMVCシナリオに影響を与えます(例えば 例: 標準の MVC ヘルパーにアクセスできない Html.ヘルパーにアクセスできない)