2010-10-18 5 views
17

J'essaie d'avoir toutes mes vues héritées d'une classe personnalisée pour pouvoir ajouter un certain comportement et des valeurs à toutes les pages, mais j'ai quelques problèmes . J'ai essayé de sous-classer System.Web.Mvc.WebViewPage mais je suis forcé d'implémenter une procédure Execute que je ne sais pas ce qu'elle devrait faire. De plus, si j'essaie d'accéder à la variable Context, j'obtiens une référence null (vraiment bizarre). Cela m'amène à penser que je peux avoir la mauvaise classe de base ....Quelle est la classe de base d'une vue Razor dans ASP.NET MVC3

Des pensées?

+0

Pourriez-vous ajouter des comportements à toutes vos classes via des méthodes d'extension, ou en avez-vous besoin pour être des méthodes d'instance? – R0MANARMY

+0

Principalement, j'ai besoin d'ajouter quelques variables qui peuvent être référencées à partir des vues. Je sais que je pourrais y parvenir en utilisant des méthodes d'extension, mais il devrait y avoir un moyen d'avoir des classes de pages d'affichage personnalisées comme avec le moteur de vue aspx. – Diego

Répondre

30

Diego, System.Web.Mvc.WebViewPage est le bon type de base (et vous devriez avoir une autre classe héritant de System.Web.Mvc.WebViewPage<TModel> si vous voulez des vues fortement typées). Vous devez marquer votre propre classe comme abstract afin que vous ne soyez pas obligé d'implémenter la méthode Execute.

Mise à jour: Pour configurer toutes vos vues afin d'utiliser votre classe de base personnalisée, consultez le fichier ~\Views\Web.config. A l'intérieur, il y a une section spécifique à Razor où vous pouvez utiliser l'attribut pageBaseType pour configurer votre type personnalisé.

En ce qui concerne la propriété Context, elle doit être entièrement initialisée une fois que la vue est en cours d'exécution. Cependant, il pourrait ne pas être disponible si vous essayez d'y accéder trop tôt (par exemple, depuis le constructeur de votre classe). Quand essayez-vous d'y accéder? La méthode Execute est quelque chose qui est fourni par le compilateur Razor lorsque votre vue est compilée. Par exemple, étant donné le fichier de vue suivant

Hello @Name! 

Le compilateur rasoir dans les coulisses génèrent la classe suivante (ce qui est une simplification, donc les détails peut-être loin, mais il doit transmettre le point)

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

Ensuite, l'infrastructure appelle la méthode Execute sur votre classe d'affichage et votre vue est exécutée.

+0

Dans le constructeur de ma classe :) Ça doit être ça alors. – Diego

+0

Juste comme un addendum à la question, qu'est-ce que la procédure Execute est supposée faire? Est-ce que je peux le remplacer par une procédure vide? – Diego

+0

@Diego J'ai édité ma réponse pour illustrer comment le compilateur génère une implémentation pour Execute. – marcind

Questions connexes