2010-10-20 6 views
19

Estoy usando la vista de maquinilla de afeitar con asp mvc vista previa 3Métodos de extensión de vista ASP MVC Razor, cómo crear métodos de vista 'global'?

Estoy tratando de crear algunos métodos que me gustaría tener disponibles directamente en las vistas. ¿Estos no son realmente los métodos Html helper así que no creo que la extensión de HtmlHelper tenga sentido?

mi objetivo, ser capaz de llamar a los métodos de la vista, es decir

@HelloWorld(); vs @Html.HelloWorld() 

puedo conseguir Html.HelloWorld para trabajar mediante la creación de un método de extensión en HtmlHelper

public static class HtmlExtensions 
{ 
    public static string HelloWorld(this HtmlHelper helper) 
    { 
     return "Hello"; 
    } 
} 

me gustaría hacer lo mismo pero para la vista; mi problema, ¿qué tipo de objeto es la vista?

Nota: yo era capaz de conseguir que esto funcione mediante la definición de los métodos en la página .cshtml

@functions 
{ 
    public string HelloWorld() 
    { 
     return "Hello"; 
    } 
} 

@HelloWorld() @* now this works *@ 

Luego trató de poner este código mi archivo _viewstart.cshtml pensando que estaría disponible en todos los puntos de vista pero no

era si sabía qué tipo de la vista se creo que se podría extender fácilmente, cualquier ayuda apreció

Respuesta

13

resulta que, el tiempo de ejecución asp va a definir el método de ejecución en tiempo de ejecución, por lo que la clase base vista personalizada también debe ser abstracta

using System; 
using System.Web.Mvc; 

namespace MyMvcWebApp.Extensions 
{ 
    public abstract class ViewBase<TModel> 
     : System.Web.Mvc.WebViewPage<TModel> where TModel : class 
    { 
     // now this will be available in any view @HelloWorld() 
     public string HelloWorld() 
     { 
      return "Hello from the ViewBase class"; 
     } 
    } 
} 

esto debería funcionar con vistas al establecimiento inflexible, parece que con razor todas las vistas están fuertemente tipadas, cuando no define el tipo 'dinámico' se usa y es el tipo fuerte

también, como Clicktricity declaró que luego actualiza el web.config (el del directorio Views)

<pages pageBaseType="MyMvcWebApp.Extensions.ViewBase"> 
+1

+1 . Esta es una solución mucho más agradable que escribir un método de extensión en WebViewPage –

+6

En realidad, estoy totalmente en desacuerdo con Noel Abrahams: es en este tipo de situación que se inventaron los métodos de extensión. La solución dada anteriormente significa que tiene un cambio de configuración que deberá realizar en cada aplicación web en la que desee usarla. Además, el uso de un método de extensión lo convierte en un uso 'extraíble' para las Vistas que desean usarlo, mientras que al cambiar la clase base obliga a cada Vista a heredar eso, lo quiera o no quiera. –

1

la clase base por defecto para las vistas de la maquinilla de afeitar se especifica en el Web.config ubicado en el directorio vistas . Por lo general es:

<pages pageBaseType="System.Web.Mvc.WebViewPage"> 

yo no lo he probado, pero yo sugeriría que hereda de esta clase base y añadir su propia funcionalidad, y luego ajustar el web.config en consecuencia.

+1

Intenté esto pero obtengo un error de compilación -> no implementa el miembro abstracto heredado 'System.Web.WebPages.WebPageExecutingBase.Execute()'; Necesito investigar un poco más; adivinando que el método normalmente se genera en tiempo de ejecución por asp.mvc? – house9

+2

Obtengo 'WebViewPage debe poder convertirse en System.Web.UI.Página' – Clark

+0

@Clark: Ese podría ser un error de Resharper: http://youtrack.jetbrains.net/issue/RSRP-200244?query=namespace –

12

Como se comentó por otros, Razor considera a todos en última instancia heredan de WebViewPage:

public abstract class WebViewPage<TModel> : WebViewPage 

lo tanto, puede simplemente escribir sus métodos de extensión para WebViewPage sin crear una nueva clase base o cambiar los archivos de configuración, que ha sido sugeridas por Otras respuestas. Por ejemplo:

public static class WebViewPageExtensions 
{ 
    public static string HollowWorld(this WebViewPage wvp) 
    { 
     return "Memento mori"; 
    } 
} 

Añadir una declaración utilizando para dicho espacio de nombres a la vista y, a continuación:

<p>@this.HollowWorld()</p> 
+0

Si algunos miembros de la comunidad ASP.NET Core tropezaron con este hilo, la clase que se extenderá aquí es: RazorPage en lugar de WebViewPage. –

1

La mejor manera de llamar a un método con argumentos que utilizan motor de la maquinilla de afeitar es el uso de ayudantes. Ejemplo: le permite tener un ayudante @MakeNote (contenido de cadena)

Luego, en la página cshtml solo necesita llamar a @MakeNote ("Hola") y debería estar bien.

Me estaba volviendo loco cuando estaba teniendo problemas, entonces google me envió a esta página pero no sirvió. Intentaba cargar contenido en html <select> con L2E usando una afeitadora.

El secreto es crear un ayudante en app_code y luego usarlo con cshtml.

Cuestiones relacionadas