2010-10-18 17 views
17

Estoy intentando que todas mis vistas hereden de una clase personalizada para que pueda agregar cierto comportamiento y valores a todas las páginas, pero tengo algunos problemas . Intenté subclasificar System.Web.Mvc.WebViewPage, pero me veo obligado a implementar un procedimiento de ejecución que no sé lo que debería hacer. Además, si intento acceder a la variable Context, obtengo una referencia nula (realmente extraña). Esto me lleva a pensar que puedo tener la clase base incorrecta ...¿Cuál es la clase base de una Razor View en ASP.NET MVC3

¿Alguna idea?

+0

¿Podría agregar comportamientos a todas sus clases a través de métodos de extensión o necesita que sean métodos de instancia? – R0MANARMY

+0

Principalmente necesito agregar algunas variables a las que se puede hacer referencia desde las vistas. Sé que podría lograr esto usando métodos de extensión, pero debería haber una manera de tener clases de página de vista personalizadas como con el motor de vista aspx. – Diego

Respuesta

30

Diego, System.Web.Mvc.WebViewPage es el tipo de base correcto (y debe tener otra clase que hereda de System.Web.Mvc.WebViewPage<TModel> si desea obtener vistas con caracteres fuertes). Debe marcar su propia clase como abstract para no tener que implementar el método Execute.

Actualización: Para configurar todas sus vistas para usar su clase base personalizada, consulte el archivo ~\Views\Web.config. En su interior hay una sección específica de Razor donde puede usar el atributo pageBaseType para configurar su tipo personalizado.

En lo que respecta a la propiedad Contexto, se debe inicializar por completo una vez que se está ejecutando la vista. Sin embargo, puede no estar disponible si intenta acceder demasiado pronto (por ejemplo, desde el constructor de clases). ¿Cuándo intentas acceder?


El método Execute es algo que proporciona el compilador Razor cuando se compila la vista. Por ejemplo, dada la siguiente archivo de vista

Hello @Name! 

El compilador maquinilla de afeitar detrás de las escenas generan la siguiente clase (esto es una simplificación, así que los detalles podría ser apagado, pero debe transmitir el punto)

public class _Some_Generated_Class_Name_ : System.Web.Mvc.WebViewPage { 
    public void Execute() { 
    Write("Hello "); 
    Write(Name); 
    Write("!"); 
    } 
} 

Luego el framework llama al método Execute en su clase de vista y su vista se ejecuta.

+0

En el constructor de mi clase :) Eso debe ser entonces. – Diego

+0

Al igual que una adición a la pregunta, ¿qué se supone que debe hacer el procedimiento Execute? ¿Está bien si lo anulo con un procedimiento en blanco? – Diego

+0

@Diego He editado mi respuesta para ilustrar cómo el compilador genera una implementación para Execute. – marcind

Cuestiones relacionadas