vista una tag que parcial net mvc example component asp asp.net-mvc asp.net-mvc-3 razor

asp.net mvc - una - Usar extensiones MVC HtmlHelper desde vistas declarativas Razor



render partial view mvc 5 example (9)

Creé un método de extensión para el ayudante de páginas web para que pueda acceder al asistente de página.

public static HtmlHelper GetPageHelper(this System.Web.WebPages.Html.HtmlHelper html) { return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html; }

Estaba intentando crear un ayudante declarativo Razor en mi carpeta App_Code para un proyecto MVC 3 RTM.

El problema que encontré fue que las extensiones MVC HtmlHelper, como ActionLink, no están disponibles. Esto se debe a que los helpers compilados se derivan de System.Web.WebPages.HelperPage , y aunque expone una propiedad Html , es de tipo System.Web.WebPages.HtmlHelper lugar de System.Web.Mvc.HtmlHelper .

Un ejemplo del tipo de error que obtengo es:

''System.Web.Mvc.HtmlHelper'' no contiene una definición para ''ActionLink'' y no se puede encontrar ningún método de extensión ''ActionLink'' que acepte un primer argumento de tipo ''System.Web.Mvc.HtmlHelper'' (¿falta una directiva using? o una referencia de montaje?)

Mi única solución ha sido crear mi propia HelperPage y reemplazar la propiedad Html:

using System.Web.WebPages; public class HelperPage : System.Web.WebPages.HelperPage { // Workaround - exposes the MVC HtmlHelper instead of the normal helper public static new HtmlHelper Html { get { return ((System.Web.Mvc.WebViewPage) WebPageContext.Current.Page).Html; } } }

Luego tengo que escribir lo siguiente en la parte superior de cada ayudante:

@inherits FunnelWeb.Web.App_Code.HelperPage @using System.Web.Mvc @using System.Web.Mvc.Html @helper DoSomething() { @Html.ActionLink("Index", "Home") }

¿Está destinado a ser tan difícil en MVC 3, o estoy haciendo algo mal?


Eche un vistazo a la respuesta de Marcind a esta pregunta. Lo que estás experimentando es una limitación de poner vistas declarativas en la carpeta App_Code .

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. Helpers estándar)


Mi enfoque para esto es simplemente pasar la página como un parámetro para el método de ayuda. Entonces en tu ejemplo sería:

@helper DoSomething(WebViewPage page) { @page.Html.ActionLink("Index", "Home") }

Luego, en su vista Razor donde lo necesite, llámelo así:

@YourHelperFilename.DoSomething(this)

Hacer esto de inmediato le da acceso a propiedades de página como Html o Url que generalmente tiene (y a través de eso las extensiones HtmlHelper ).

Como beneficio adicional (si lo necesita), también obtiene acceso a las propiedades de la instancia, como ViewData la página.


Omar tiene la respuesta correcta aquí, pero yo quería agregar algo (no dude en marcar la respuesta de Omar como la respuesta).

Éramos conscientes de esto en v1 y no pudimos obtener una buena solución en el producto, pero David Ebbo (un arquitecto en el equipo de ASP.Net) publicó una muestra de un Generador de código de Visual Studio que es básicamente una primera exploración de el tipo de ideas que estamos viendo para hacer que esto funcione correctamente: http://blogs.msdn.com/b/davidebb/archive/2010/10/27/turn-your-razor-helpers-into-reusable-libraries.aspx

Pruébalo y mira lo que piensas! Hágale saber a David si tiene comentarios publicando en su blog.


Para beneficio de los buscadores, obtuve el mismo error al crear vistas MVC como parte de una biblioteca de clases (para la reutilización de componentes). La solución, aludida en parte anteriormente, consistía en agregar las siguientes instrucciones de uso en la parte superior del archivo .cshtml:

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

No es necesario más trabajo.



Sé que hay algunos problemas de intellisense con MVC 3. Creo que los helpers seguirán funcionando si tienes el espacio de nombres configurado en web.config.

MVC 3 RTM acaba de ser lanzado ¿estás usando esto o una beta?


Similar a la respuesta de @Jakes:

public static class MvcIntrinsics { public static System.Web.Mvc.HtmlHelper Html { get { return ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Html; } } public static System.Web.Mvc.AjaxHelper Ajax { get { return ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Ajax; } } public static System.Web.Mvc.UrlHelper Url { get { return ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Url; } } }

Uso:

@MvcIntrinsics.Html.Raw("test")

Fuente: Dino Esposito - Programación de Microsoft ASP.NET MVC


Una solución alternativa:

Agregue esto encima de su archivo razor-helper:

@functions { public static System.Web.Mvc.HtmlHelper<object> HHtml = ((System.Web.Mvc.WebViewPage)WebPageContext.Current.Page).Html; }

luego llámalo así:

@HHtml.ActionLink("actionname")