2009-05-29 8 views
0

J'ai créé ma propre classe de base CustomController qui hérite de Controller. De même, j'ai créé mon propre CustomViewData qui hérite de ViewDataDictionary. La classe CustomController a un ctor qui accepte un paramètre CustomViewData en tant que paramètre.Modification du type de ViewData dans le contrôleur étendu

Tous mes contrôleurs héritent de CustomController et transmettent leur CustomViewData hérité. Maintenant, je veux être en mesure d'appeler this.ViewData à partir de mon contrôleur et de récupérer les données d'affichage que j'ai transmis au contrôleur. Actuellement, je récupère un ViewDataDictionary (de la classe Controller). J'ai donc perdu mes informations de type. Comment puis-je conserver mes informations de type sur ma propriété ViewData dans ma classe dérivée de CustomController sans l'encapsuler dans un get/set qui fait la boxe pour moi?

Répondre

0

J'ai essayé plusieurs façons d'atteindre mon objectif, mais aucune ne semble fonctionner sauf cette solution moche que je savais exister mais qui est ... bien, moche.
En gros, j'enveloppe la boxe/unboxing dans un get/set. Je dois le faire tout au long de la chaîne de classe. Donc, mon CommonController le fait avec une instance CommonViewData, mon AbcController: CommonController le fait depuis AbcViewData: CommonViewData vers CommonViewData etc. Jusqu'à ce que je trouve une meilleure solution, je vais devoir aller avec ça.

public new AbcViewData ViewData { 
    get { return base.ViewData as [bcViewData; } 
    set { base.ViewData = value; } 
} 
+0

pense que quelque chose dans le sens de la suggestion de Gerardo est le chemin à parcourir. vous voulez vraiment éviter le casting hé –

+0

Oui, si je pouvais, je ne le ferais pas. Mais lorsque je crée une instance dans le contrôleur hérité avec le nouveau mot-clé, puis modifiez l'état de ViewData dans customController, l'état n'est pas représenté dans le contrôleur hérité. Le nouveau mot-clé cache essentiellement le précédent (le rend inaccessible, mais toujours existant) donc il y aura maintenant deux instances de viewdata. ContengController.ViewData (est CotengViewData) et un dans InheritedController.ViewData (est InheritedViewData). –

+0

Appelez votre personnalisé quelque chose d'autre alors? comme dans: propriété CustomViewData de type CustomViewData. –

1

propriété ViewData est définie dans la classe ControllerBase et vous ne pouvez pas l'ignorer, mais vous pouvez le faire:

public class CustomController : Controller { 

    public new CustomViewData ViewData { get; set; } 

} 

Mais attention, si vous accédez à une instance CustomController comme celui-ci

Controller c = myCustomControllerInstance; 
CustomViewData cvd = c.ViewData; 

votre code ne compilera pas car vous utiliserez l'implémentation par défaut de la propriété ViewData et il retournera une instance de ViewDataDictionary.

+0

Je crains de ne pas pouvoir utiliser le nouveau mot-clé car il semble créer une instance parallèle de la variable ViewData. Ce que j'essaye d'accomplir est qu'avant l'action exécutée, certains de mes champs sont remplis par la classe de CustomController. –

+0

sorte de ce que je vais suggérer: mais sans le mot-clé «nouveau». pourquoi pouvez-vous avoir une valeur de champ pour votre type CustomViewData et paresseux-init il? –

Questions connexes