Rasoio: helper dichiarativi HTML

Sto cercando di scrivere un semplice helper dichiarativo in html:

@helper Echo(string input) { @input } 

L’helper funziona bene se lo incorporo nella pagina in cui voglio usarlo. Ma se lo sposto in un file .cshtml separato e lo .cshtml nella directory ~/Views/Helpers , la mia vista non può più essere compilata perché l’helper non viene trovato. Secondo l’ articolo del blog di Scott Gu su Razor , dovrebbe funzionare.

Che cosa sto facendo di sbagliato?

La posizione ~/Views/Helpers come descritto in quel post di ScottGu non funzionerà in MVC 3 RTM. All’epoca in cui è stato scritto questo articolo era un’idea di design che stavamo girando intorno ma alla fine non siamo stati in grado di implementarlo.

Mettere i tuoi aiutanti in App_Code funziona ma presenta alcune limitazioni che influiscono su alcuni scenari MVC (ad esempio: nessun accesso agli helper MVC standard di MVC)

Soluzione semplice:

In ogni helper aggiungi la pagina WebViewPage.

App_Code \ Test.cshtml:

 @using System.Web.Mvc.Html @using System.Web.Mvc @helper HelloWorld(WebViewPage page) { @page.Html.Label("HelloWorld") } 

Questo utilizzo dell’assistente in qualsiasi pagina:

  @Test.HelloWorld(this) 

Come diceva marcind , non siamo stati in grado di supportare la posizione ~/Views/Helpers causa di alcune limitazioni nel nostro modello di compilazione.

Stiamo lavorando a una soluzione migliore per gli helper HTML dichiarativi, ma non renderà la v1. Per v1, abbiamo due soluzioni:

  1. App_Code (che ha alcuni problemi come menzionato da Marcin, ma funziona)
  2. David Ebbo (membro del team) ha un componente aggiuntivo di Visual Studio che li compila nella tua DLL

Ho seguito anche i passaggi elencati nel blog di Scott e non sono riuscito a farlo funzionare.

Ho fatto qualche ricerca e ho trovato questo link: http://dotnetslackers.com/articles/aspnet/Experience-ASP-NET-MVC-3-Beta-the-Razor-View-Engine.aspx#s19-create-custom-helper -metodo

Seguito i passaggi e sta funzionando. La chiave sembra essere sia la cartella App_Code che il nome del file dot helper nome quando si chiama l’helper.

In App_Code a @helper ha bisogno di questo per funzionare correttamente:

 // 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... } 

So che questo è in ritardo nel gioco … Ma, passa nella visualizzazione corrente alla funzione di aiuto. Dalla vista si ha accesso a Html e alle funzioni di supporto.

Un’altra presa sulla risposta di CodeAngry , questo abilita gli helper per ogni metodo nel file.

 @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; } } }