web-dev-qa-db-ja.com

Razor:宣言的なHTMLヘルパー

私は、単純な宣言型HTMLヘルパーを作成しようとしています。

@helper Echo(string input) {
    @input
}

ヘルパーは、使用したいページに埋め込むと正常に機能します。しかし、別の.cshtmlファイルに移動し、そのファイルを~/Views/Helpersディレクトリに配置すると、ヘルパーが見つからないため、ビューをコンパイルできなくなります。 Scott Guによると Razorのブログ記事 うまくいくはずです。

私は何を間違えていますか?

48
Adrian Grigore

~/Views/Helpers ScottGu投稿に記載されている場所は、MVC 3 RTMでは機能しません。その記事が書かれた時点では、それは私たちがぐるぐる回っていたデザインのアイデアでしたが、最終的には実装することができませんでした。

ヘルパーをApp_Codeに配置することはできますが、特定のMVCシナリオに影響する特定の制限があります(例:標準MVCにアクセスできないHtml.ヘルパー)

49
marcind

簡単な回避策:

各ヘルパーに引数WebViewPageページを追加します。

App_Code\Test.cshtml:

@using System.Web.Mvc.Html
@using System.Web.Mvc

@helper HelloWorld(WebViewPage page)
{
    @page.Html.Label("HelloWorld")
}

任意のページでのこのヘルパーの使用法:

 @Test.HelloWorld(this)
36
Serj-Tm

marcindが言ったように 、コンパイルモデルのいくつかの制限のため、~/Views/Helpersロケーションをサポートできませんでした。

宣言型HTMLヘルパーのためのより良いソリューションに取り組んでいますが、v1にはなりません。 v1には、2つのソリューションがあります。

  1. App_Code(Marcinが述べたようにいくつかの問題がありますが、動作します)
  2. David Ebbo(チームのメンバー)には DLLにコンパイルするVisual Studioアドイン があります

App_Codeでは、@ helperが適切に機能するためにこれが必要です:

// These are important for `Html.RouteLink` and such.
@using System.Web.Mvc;
@using System.Web.Mvc.Routing;
@using System.Web.Mvc.Html;
@using System.Web.Mvc.Razor;

@helper SomeHelper()
{
    // Get page and pull helper references from it.
    var wvp = PageContext.Page as System.Web.Mvc.WebViewPage;
    var Url = wvp.Url; // UrlHelper access
    var Html = wvp.Html; // HtmlHelper access
    var ViewBag = wvp.ViewBag;
    // Helper code comes here...
}
7
CodeAngry

Scottのブログにも記載されている手順を実行しましたが、動作させることもできませんでした。

私はいくつかの検索を行い、このリンクを見つけました: http://dotnetslackers.com/articles/aspnet/Experience-ASP-NET-MVC-3-Beta-the-Razor-View-Engine.aspx#s19-create -custom-helper-method

手順に従って、それは機能しています。キーは、ヘルパーを呼び出すときにファイル名ドットヘルパー名を使用するだけでなく、App_Codeフォルダーでもあるようです。

6
Brian Ball

私はこれがゲームの後半にあることを知っています...しかし、現在のビューをヘルパー関数に渡します。ビューから、Htmlおよびヘルパー関数にアクセスできます。

4
Jim Shaw

CodeAngryの答え を別の方法で使用すると、ファイル内のすべてのメソッドのヘルパーが有効になります。

@using System.Web.Mvc;
@using System.Web.Mvc.Html;
@using System.Web.Mvc.Routing;
@using System.Web.Mvc.Razor;

@functions {
    private static WebViewPage page { get { return PageContext.Page as WebViewPage; } }
    private static System.Web.Mvc.HtmlHelper Html { get { return page.Html; } }
    private static UrlHelper Url { get { return page.Url; } }
    private static dynamic ViewBag { get { return page.ViewBag; } }
}
3
Ryan Buddicom