2010-12-15 21 views
48

estoy tratando de escribir una sencilla ayuda HTML declarativa:Razor: ayudantes HTML declarativos

@helper Echo(string input) { 
    @input 
} 

El ayudante funciona bien si lo integrar en la página quiero usarlo en. Pero si lo muevo a un archivo separado .cshtml y coloco ese archivo en el directorio ~/Views/Helpers, mi vista ya no puede compilarse porque no se encuentra el helper. De acuerdo con blog article on Razor de Scott Gu, debería funcionar.

¿Qué estoy haciendo mal?

+0

Estoy bastante seguro de que los ayudantes no están habilitados en una vista separada por el momento. Sé que está en proceso sin embargo. – Buildstarted

Respuesta

47

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 a ciertos escenarios MVC (por ejemplo: no tiene acceso a MVC estándar Html. ayudantes)

+5

¿Significa esto que los helpers declarativos de HTML están efectivamente muertos? ¿Dónde está la ventaja sobre una vista parcial normal? –

+0

No están muertos y estamos pensando en proporcionar algunos complementos (a través de MvcFutures, o un paquete nuget) eso resolverá los problemas. Pero en este punto su futuro es "borroso". – marcind

+0

Indagué un poco sobre esto y tengo una pregunta/propuesta para apoyar los métodos 'Html' para declarative @helpers en la carpeta App_Code. ¿Puede tener una mirada y ver si funcionaría? http://stackoverflow.com/questions/5282655/why-is-the-htmlhelper-instance-null-in-a-razor-declarative-helper-method/5282713#5282713 –

6

He seguido los pasos que figuran en el blog de Scott como bien y no era capaz de conseguir que funcione bien.

he hecho un poco de búsqueda 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

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

+0

No creo que sea la manera en que se supone que los ayudantes Razor funcionan, pero es una buena solución. ¡Muchas gracias! –

+0

Lamentablemente, el sitio web dotnetslackers.com ya no existe. Si hubiera citado algo de eso o publicado el título del artículo, podría haber encontrado el artículo en otro lugar usando Google si se ha publicado en otro lugar. :-( – ChrisW

9

As marcind said, que no fueron capaces de soportar la ubicación ~/Views/Helpers debido a algún limitaciones en nuestro modelo de compilación.

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

  1. App_Code (que tiene algunos problemas que se han mencionado Marcin, pero funciona)
  2. David Ebbo (miembro del equipo) tiene a Visual Studio add-in that compiles them into your DLL
+0

¿la versión final de mvc 3 lo admite ahora? – xport

+0

@Recycle Bin: aparentemente no. –

+0

No, lo he verificado con otra publicación aquí: http://stackoverflow.com/questions/4988135/declarative-helper-methods-in-razor-rtm –

35

solución simple:

En cada helper añadir página argumento WebViewPage.

App_Code \ Test.cshtml:

@using System.Web.Mvc.Html 
@using System.Web.Mvc 

@helper HelloWorld(WebViewPage page) 
{ 
    @page.Html.Label("HelloWorld") 
} 

Este uso ayudante en cualquier página:

@Test.HelloWorld(this) 
+0

Esto no parece funcionar - page.Html no contiene Label (ni ninguno de los otros métodos auxiliares) –

+0

helper method Etiqueta (y otra) es la extensión, declarada en la clase System.Web.Mvc.Html.LabelExtension. add using System.Web.Mvc.Html –

+2

Funcionó muy bien en mi caso, necesitaba acceder al helper Html.AttributeEncode. Gracias DarkGray! – dwhite

4

Sé que esto es el final del partido ... Pero, pase en la vista actual a la función auxiliar. Desde la vista, tiene acceso a Html y a las funciones auxiliares.

6

En App_Code un @helper necesario 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... 
} 
2

otra toma en CodeAngry's answer, esto permite 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; } } 
} 
+0

Estas funciones no son necesarias en MVC 5.x (y tal vez antes). Parece que la clase base 'HelperPage' ahora tiene las propiedades Page y Html incorporadas, por lo que, por ejemplo, puedes usar' Page.Url' y 'Page.ViewBag' directamente en tu código auxiliar. –

+0

¿Estás seguro? Todavía no puedo acceder a estos ayudantes en un nuevo proyecto sobre el último mvc. Quizás intellisense es solo decirme mentiras;) – rbuddicom

Cuestiones relacionadas