私は、単純な宣言型HTMLヘルパーを作成しようとしています。
@helper Echo(string input) {
@input
}
ヘルパーは、使用したいページに埋め込むと正常に機能します。しかし、別の.cshtml
ファイルに移動し、そのファイルを~/Views/Helpers
ディレクトリに配置すると、ヘルパーが見つからないため、ビューをコンパイルできなくなります。 Scott Guによると Razorのブログ記事 うまくいくはずです。
私は何を間違えていますか?
~/Views/Helpers
ScottGu投稿に記載されている場所は、MVC 3 RTMでは機能しません。その記事が書かれた時点では、それは私たちがぐるぐる回っていたデザインのアイデアでしたが、最終的には実装することができませんでした。
ヘルパーをApp_Codeに配置することはできますが、特定のMVCシナリオに影響する特定の制限があります(例:標準MVCにアクセスできないHtml.
ヘルパー)
簡単な回避策:
各ヘルパーに引数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)
marcindが言ったように 、コンパイルモデルのいくつかの制限のため、~/Views/Helpers
ロケーションをサポートできませんでした。
宣言型HTMLヘルパーのためのより良いソリューションに取り組んでいますが、v1にはなりません。 v1には、2つのソリューションがあります。
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...
}
Scottのブログにも記載されている手順を実行しましたが、動作させることもできませんでした。
私はいくつかの検索を行い、このリンクを見つけました: http://dotnetslackers.com/articles/aspnet/Experience-ASP-NET-MVC-3-Beta-the-Razor-View-Engine.aspx#s19-create -custom-helper-method
手順に従って、それは機能しています。キーは、ヘルパーを呼び出すときにファイル名ドットヘルパー名を使用するだけでなく、App_Codeフォルダーでもあるようです。
私はこれがゲームの後半にあることを知っています...しかし、現在のビューをヘルパー関数に渡します。ビューから、Htmlおよびヘルパー関数にアクセスできます。
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; } }
}