net mvc custom asp c# asp.net-mvc asp.net-mvc-3 razor html-helper

c# - mvc - Navaja: ayudantes declarativos de HTML



razor helpers (7)

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 compilarse 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)


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


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.



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 compilació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 compila en su DLL

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