2010-10-18 16 views
17

Sto cercando di ereditare tutte le mie viste da una classe personalizzata in modo da poter aggiungere determinati comportamenti e valori a tutte le pagine, ma sto riscontrando alcuni problemi . Ho provato la sottoclasse System.Web.Mvc.WebViewPage ma sono costretto a implementare una procedura Execute che non so cosa dovrebbe fare. Inoltre, se provo ad accedere alla variabile Context, ottengo un riferimento null (davvero strano). Questo mi porta a pensare che potrei avere la classe base sbagliata ....Qual è la classe base di una visualizzazione del rasoio in ASP.NET MVC3

Qualche idea?

+0

È possibile aggiungere comportamenti a tutte le classi tramite metodi di estensione oppure è necessario che siano metodi di istanza? – R0MANARMY

+0

Principalmente ho bisogno di aggiungere alcune variabili che possono essere referenziate all'interno delle viste. So che potrei ottenere ciò usando i metodi di estensione, ma ci dovrebbe essere un modo di avere classi di visualizzazione personalizzate come con il motore di visualizzazione aspx. – Diego

risposta

30

Diego, System.Web.Mvc.WebViewPage è il tipo di base corretto (e si dovrebbe avere un'altra classe che eredita da System.Web.Mvc.WebViewPage<TModel> se si desidera una visualizzazione fortemente tipizzata). Dovresti contrassegnare la tua classe come abstract in modo da non essere forzato ad implementare il metodo Execute.

Aggiornamento: Per configurare tutte le visualizzazioni per l'utilizzo della classe base personalizzata, esaminare il file ~\Views\Web.config. All'interno di esso è presente una sezione specifica per il rasoio in cui è possibile utilizzare l'attributo pageBaseType per configurare il tipo personalizzato.

Per quanto riguarda la proprietà Context, è necessario inizializzarlo completamente dopo l'esecuzione della vista. Tuttavia, potrebbe non essere disponibile se si tenta di accedervi troppo presto (ad esempio, dal costruttore delle classi). Quando stai cercando di accedervi?


Il metodo Execute è qualcosa che viene fornito dal compilatore Razor quando la vista è compilata. Ad esempio, dato il seguente file vista

Hello @Name! 

Il compilatore Razor sarà dietro le quinte generano la seguente classe (questa è una semplificazione, in modo che i dettagli potrebbe essere spento, ma dovrebbe trasmettere il punto)

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

Quindi il framework chiama il metodo Execute sulla classe view e la vista viene eseguita.

+0

Nel costruttore della mia classe :) Deve essere così. – Diego

+0

Proprio come un addendum alla domanda, che cosa dovrebbe fare la procedura Execute? Va bene se ho appena scavalcato con una procedura vuota? – Diego

+0

@Diego Ho modificato la mia risposta per illustrare come il compilatore genera un'implementazione per Execute. – marcind

Problemi correlati