Intenté crear un asistente declarativo Razor en mi carpeta App_Code para un proyecto MVC 3 RTM.
El problema con el que me encontré fue que las extensiones MVC HtmlHelper, como ActionLink, no están disponibles. Esto se debe a que los ayudantes compilados se derivan System.Web.WebPages.HelperPage
, y aunque exponen una Html
propiedad, es de tipo en System.Web.WebPages.HtmlHelper
lugar de System.Web.Mvc.HtmlHelper
.
Un ejemplo del tipo de error que estaba recibiendo 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 de uso o una referencia de ensamblaje?)
Mi única solución ha sido crear mi propio HelperPage y anular 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?
fuente
Respuestas:
Eche un vistazo a
Marcind
la respuesta a esta pregunta. Lo que está experimentando es una limitación de poner vistas declarativas en laApp_Code
carpeta.fuente
Creé un método de extensión para el ayudante de WebPages para poder acceder al ayudante de la página.
fuente
@Html.GetPageHelper().ActionLink("actioname")
@using System.Web.Mvc
y@using System.Web.Mvc.Html
en el archivo de ayuda cshtml dentro de App_CodeHtmlHelper
clase para fines de codificación, encontré una forma aún más rápida de hacerlo a través de la clase estáticaMicrosoft.Security.Application.Encoder
como en:Encoder.HtmlAttributeEncode(value)
Omar tiene la respuesta correcta aquí, pero quería agregar algo (no dude en marcar la respuesta de Omar como la respuesta).
Sabíamos esto en v1 y no pudimos obtener una solución excelente en el producto, pero David Ebbo (un arquitecto del equipo 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 buscando para 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 ve lo que piensas! Avísele a David si tiene comentarios publicando en su blog.
fuente
Respuesta similar a @Jakes:
Uso:
Fuente: Dino Esposito - Programación de Microsoft ASP.NET MVC
fuente
Una solución alternativa:
Agregue esto en la parte superior de su archivo razor-helper:
entonces llámalo así:
fuente
Mi enfoque para esto es simplemente pasar la página como parámetro al método auxiliar. Entonces, en su ejemplo, sería:
Luego, en su vista Razor donde lo necesita, llámelo así:
Hacer esto inmediatamente te da acceso a propiedades de página como
Html
oUrl
que usualmente tienes (y a través de eso lasHtmlHelper
extensiones).Como beneficio adicional (si lo requiere), también obtiene acceso a propiedades de instancia, como las de la página
ViewData
.fuente
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, parcialmente aludida anteriormente, fue agregar lo siguiente usando declaraciones en la parte superior del archivo .cshtml:
No se necesita más trabajo.
fuente
"Could not load type 'System.Web.WebPages.Instrumentation.InstrumentationService' from assembly 'System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'."
al flotar@using System.Web.Mvc
. ¿Algunas ideas?Sé que hay algunos problemas de inteligencia con MVC 3. Creo que los ayudantes seguirán funcionando si tiene el espacio de nombres configurado en web.config.
MVC 3 RTM acaba de ser lanzado ¿Estás usando esto o una versión beta?
fuente
Parece que ASP.NET MVC ha solucionado este problema en VS 2013. Vea esta publicación http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/3670180-support-helper-extensionmethod-this- htmlhelper-ht
fuente
@using System.Web.Mvc.Html
en la parte superior del archivo cshtml en App_Code, pero escribir @Html ... no revela ninguno de los métodos de extensión comoEditorFor
. Es ridículo que esto no funcione después de 2 lanzamientos importantes y publicaciones de blog que afirman que se implementó. No es. De hecho, los métodos de extensión no pueden funcionar, porque están dirigidos a la clase System.Web.Mvc.HtmlHelper, no a la clase System.Web.WebPages.HtmlHelper, que está expuesta por la clase System.Web.WebPages.HelperPage.