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.
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-method
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.
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:
- App_Code (que tiene algunos problemas como mencionó Marcin, pero funciona)
- 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...
}