2010-12-03 38 views
1

Avant de passer à la question, laissez-moi vous donner un peu de contexte. J'essaie de développer un mécanisme de mise en cache personnalisé que je peux appliquer aux contrôles utilisateur personnalisés. (Sachez que je sais qu'il existe un mécanisme de mise en cache intégré dans .NET) Selon certains indicateurs définis de manière déclarative dans le balisage, le contrôle doit charger une version mise en cache de son contenu précédemment rendu ou exécuter normalement (et si certains indicateurs sont définis, il devrait générer un cache de son contenu pour la prochaine fois qu'il charge). J'aimerais pouvoir transmettre certains drapeaux de manière déclarative dans le balisage et pouvoir vérifier leur valeur à la page Init et, selon la valeur de l'indicateur, déterminer si le contrôle doit charger une version mise en cache ou non.Est-il possible de 'DataBind' une seule propriété d'un contrôle utilisateur?

<uc:MyUC ID="N1" runat="server" 
    CacheProp='<%# SomeEnum.A | SomeEnum.B |SomeEnum.C %>' 
    PropA='<%# this.SomePropA %>' 
    PropB='<%# (this.SomePropB %>' 
    PropC='<%# this.SomePropC %>' 
/> 

Le problème que je suis face est que, pour autant que je sache, je ne peux obtenir la valeur des propriétés déclarative affectées à la marge si je l'appelais DataBind(). Cependant, je suis confronté à deux problèmes: Premièrement appeler this.DataBind() de MyUC va déclencher la liaison de tous ses contrôles enfants qui irait à l'encontre de l'objectif de la mémoire cache; tous les contrôles utilisateur ont été construits de manière à ce qu'ils n'appellent pas DataBind() avant que l'événement LoadComplete ait été déclenché, donc pour s'assurer que les contrôles parents dans lesquels ils vivent ont fait leur initialisation et ont calculé les propriétés qui sont déclarées au contrôle utilisateur enfant (c'est-à-dire PropA, PropB, PropC). Et maintenant la question: existe-t-il un moyen de lier la propriété CacheProp afin de récupérer sa valeur sans liaison de données toutes les autres propriétés et sans déclencher la liaison de données de tous ses contrôles enfants?

Merci de votre aide!

Giuseppe

+0

je commence à penser qu'il est impossible! :( –

+0

Pourquoi pas simplement ''? Comment voulez-vous définir ces propriétés? –

+0

Malheureusement, cela ne fonctionne pas comme il passe la propriété "SomeEnum.A | SomeEnum.B | SomeEnum.C" en tant que chaîne et non la valeur évaluée de l'OR bit à bit. –

Répondre

0

Cela devrait fonctionner:

<uc:MyUC ID="N1" runat="server" CacheProp="A|B|C"... >

code derrière:

strRawValue = N1.Attributes["CacheProp"]; 
string[] arrValues = strRawValue.Split('|'); 
SomeEnum value = (SomeEnum)Enum.Parse(typeof(SomeEnum), arrValues[0]); 
for (int i = 1; i < arrValues.Length; i++) 
    value |= (SomeEnum)Enum.Parse(typeof(SomeEnum), arrValues[i]);