2010-02-04 5 views
22

Je développe une application ASP.NET avec C# et Ajax.Transmettre dynamiquement des données d'une page ASP.NET à des commandes utilisateur ASCX

J'ai une page qui contient dynamiquement les commandes utilisateur chargées. J'ai besoin de transmettre certaines données (valeurs entières et certaines chaînes) au contrôle utilisateur qui a été chargé dynamiquement.

Maintenant j'utilise Session pour transmettre ces valeurs, mais je pense que je peux utiliser d'une autre façon; quelque chose comme VIEWSTATE ou une entrée cachée.

Que me recommandez-vous?

MISE À JOUR:

Le fait que je charge les contrôles est dynamique importante parce que les contrôles sont chargés sur chaque publication, et je ne peux pas stocker toute valeur sur les contrôles.

Répondre

39

Créez une propriété sur votre contrôle utilisateur avec le type de données que vous souhaitez lui transmettre, et remplissez-la dans votre page lors de la création du contrôle.

public class myControl : Control 
{ 
    ... 
    public int myIntValue {get; set;} 
    ... 
} 

Dans le code sous-jacent:

myControl ctrl = new myControl(); 
ctrl.myIntValue = 5; 

Vous pouvez aussi le faire directement dans le balisage:

<uc1:myControl ID="uc1" runat="server" myIntValue="5" /> 
+0

Ceci est une excellente réponse, mais je ne peux pas l'utiliser parce que les contrôles sont chargés dynamiquement. Peut-être que je vais utiliser des champs cachés. Je vous remercie. – VansFannel

+2

Vous devez utiliser ViewState pour conserver l'état du contrôle. – Oded

+1

Et comment puis-je détenir les valeurs des protections publiques sur ViewState? J'essaie de le faire, mais myIntValue est toujours zéro. – VansFannel

10

Configuration des propriétés publiques au sein de votre contrôle utilisateur.

public string TestValue { get;set;}; 

Et puis quand vous mettez votre contrôle utilisateur dans votre page ASPX:

<uc1:UserControl ID="uc1" runat="server" TestValue="Testing" /> 

Vous pouvez également modifier les valeurs dans votre code derrière:

uc1.testValue = "some value"; 
+0

C'est une excellente réponse mais je ne peux pas l'utiliser car les contrôles sont chargés dynamiquement. Peut-être que je vais utiliser des champs cachés. Je vous remercie. – VansFannel

0

Type de défaites le but d'utiliser un IMO de contrôle ascx puisque cela casse l'encapsulation de contrôle. Votre page devrait être -getting- données du contrôle par l'abonnement aux événements publiés par le contrôle.

+0

Je dois passer des données de PAGE à CONTROL. – VansFannel

+1

Comment cela casse l'encapsulation? –

3

Pour répondre réellement à votre question, autant que tout le monde semble ne pas vouloir que vous fassiez cela, et je suis d'accord ... J'ai déjà fait ce genre de chose auparavant.

La première chose que je ferais est de faire de votre page une interface.

Dans le contrôle:

IVansFannelDataProviderPage provider = this.Page as IVansFannelDataProviderPage; if (provider != null) { //grab data from interface } else throw YouCantPutThisControlOnThisKindOfPageException();

Ce n'est pas la façon la plus élégante de le faire, mais quand nous avons eu beaucoup de contrôles qui souhaitent partager un objet très cher cette l'affaire.

Cela fonctionne bien, mais rend votre contrôle inutilisable sur les pages qui n'implémentent pas l'interface - et qui rend les contrôles trop étroitement couplés à votre page. Tout le monde disant que la page obtient les données des contrôles est correct; vous mettez des contrôles sur la page, pas des pages dans les contrôles.

Vous devriez avoir une très bonne raison de le faire. Pour nous: la charge de l'objet partagé était très chère, et le fait de charger/sauvegarder la page quel que soit le contrôle sur cet objet était très utile. Il était dommage que beaucoup de pages qui n'implémentent pas vraiment l'interface aient été utilisées pour fournir une sorte de support ou de support de proxy juste pour que les contrôles fonctionnent, et ont fait les pages et les commandes autant moins réutilisable.

Si je devais le refaire, la page enverrait des données aux contrôles avec des événements, probablement par réflexion si j'avais besoin d'être paresseux.

+0

Et qu'en est-il de l'utilisation des propriétés publiques sur les contrôles utilisateur? – VansFannel

+0

Cela fonctionnerait. Les événements ou les propriétés publiques sont à peu près les mêmes * en termes de couplage. * – Broam

+0

Je suis vraiment désolé, mais si je charge les contrôles dynamiquement, je ne peux pas utiliser les propriétés publiques. – VansFannel

0

Vous pouvez définir des valeurs dans la collection HttpContext.Items et les lire dans vos contrôles. C'est comme si vous utilisiez Session, sauf qu'elle n'est disponible que par requête, pas pour toute la durée de la session.

http://www.4guysfromrolla.com/articles/060904-1.aspx

à mon humble avis c'est un peu paresseux, mais il pourrait être une bonne solution dans certaines situations.

Questions connexes