Navaja: ayudantes declarativos de HTML

Intento escribir un ayudante html declarativo simple:

@helper Echo(string input) { @input } 

El asistente funciona bien si lo inserto en la página en la que quiero usarlo. Pero si lo muevo a un archivo .cshtml separado y lo .cshtml en el directorio ~/Views/Helpers , mi vista ya no puede comstackrse porque no se encuentra el helper. Según el artículo del blog de Scott Gu sobre Razor debería funcionar.

¿Qué estoy haciendo mal?

La ubicación ~/Views/Helpers como se describe en esa publicación de ScottGu no funcionará en MVC 3 RTM. En el momento en que se escribió el artículo, era una idea de diseño que estábamos lanzando, pero al final no pudimos implementarla.

Poner sus ayudantes en App_Code funciona pero tiene ciertas limitaciones que afectan ciertos escenarios de MVC (por ejemplo: no tener acceso a MVC Html. estándar)

Solución simple:

En cada ayuda, agregue el argumento página WebViewPage.

App_Code \ Test.cshtml:

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

Este uso de ayudante en cualquier página:

  @Test.HelloWorld(this) 

Como dijo marcind , no pudimos soportar la ubicación ~/Views/Helpers debido a algunas limitaciones en nuestro modelo de comstackción.

Estamos trabajando en una solución mejor para los ayudantes declarativos de HTML, pero no creará v1. Para v1, tenemos dos soluciones:

  1. App_Code (que tiene algunos problemas como mencionó Marcin, pero funciona)
  2. David Ebbo (miembro del equipo) tiene un complemento de Visual Studio que los comstack en su DLL

Seguí los pasos detallados en el blog de Scott y tampoco pude hacerlo funcionar.

Hice algunas búsquedas y encontré este enlace: http://dotnetslackers.com/articles/aspnet/Experience-ASP-NET-MVC-3-Beta-the-Razor-View-Engine.aspx#s19-create-custom-helper -método

Seguí los pasos y está funcionando. La clave parece ser tanto la carpeta App_Code como el nombre de archivo dot helper name cuando se llama al helper.

En App_Code, @helper necesita que esto funcione correctamente:

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

Sé que esto es tarde en el juego … Pero, pasa la vista actual a la función de ayuda. Desde la vista, tiene acceso a Html y a las funciones auxiliares.

Otra toma de la respuesta de CodeAngry , esto habilita a los ayudantes para cada método en el archivo.

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