web-dev-qa-db-fra.com

Passer des données d'une page ASP.NET aux contrôles utilisateur ASCX chargés dynamiquement

Je développe une application ASP.NET avec C # et Ajax.

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

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

Que me recommandez-vous?

MISE À JOUR:

Le fait que je charge les contrôles dynamiquement est important car les contrôles sont chargés à chaque publication et je ne peux pas stocker de valeur sur les contrôles.

24
VansFannel

Créez une propriété sur votre contrôle utilisateur avec le type de données des 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 derrière:

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

Vous pouvez également le faire directement dans le balisage:

<uc1:myControl ID="uc1" runat="server" myIntValue="5" />
45
Oded

Configurez les propriétés publiques dans votre contrôle utilisateur.

public string TestValue { get;set;};

Et puis, lorsque vous placez votre contrôle utilisateur dans votre page aspx:

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

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

uc1.testValue = "some value";
11
Jack Marchetti

Vous devrez recharger ces contrôles sur chaque post-back ... Lisez ceci. Ça pourrait aider.

contrôles Web dynamiques, publications et état d'affichage

3
Billy Coover

Pour répondre à 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 choses auparavant.

La première chose que je ferais serait de faire en sorte que votre page implémente 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 avions beaucoup de contrôles voulant partager un objet très cher, cela convenait.

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

Vous devriez avoir une très bonne raison pour le faire. Pour nous: le chargement de l'objet partagé était très cher, et le chargement/enregistrement de la page, quel que soit le contrôle fonctionnant sur cet objet, était très utile.

Il était dommage que beaucoup de pages qui n'ont pas vraiment implémenté l'interface aient dû être corrigées pour fournir une sorte de support ou de proxy juste pour que les contrôles fonctionnent, et ont rendu les pages et les contrôles beaucoup moins réutilisables.

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

3
Broam

Sorte du but de l'utilisation d'un contrôle ascx IMO car cela rompt l'encapsulation du contrôle. Votre page doit -obtenir- des données du contrôle en vous abonnant aux événements publiés par le contrôle.

0
Pierreten

Vous pouvez définir des valeurs dans la collection HttpContext.Items et les lire dans vos contrôles. C'est comme utiliser Session, sauf qu'il n'est disponible que par demande et non pour toute la durée de vie de la session.

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

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

0
OrionRobillard