1

Ce que je voudrais savoir, c'est s'il existe une technique pour injecter des paramètres dans le rendu HttpContext de sorte qu'il soit disponible pour le UserControl lors de ses événements de cycle de vie de page (Page_Init, Page_Load) sont appelés pendant le rendu (pendant HttpContext.Current.Server.Execute())?Injection de paramètres dans des UserControls créés de manière dynamique sans spécialisation

Une telle technique permettrait d'injecter des données dans n'importe quel UserControl (par exemple via un appel à un service distant) sans avoir à le spécialiser pour un rendu dynamique. Il se chargerait de la même manière que s'il s'agissait d'un contrôle statique sur une page ASPX.

Commencez avec ce fragment de code de base:

Page page = new Page(); 
UserControl ctl = (UserControl)page.LoadControl(controlSpec); 
page.Controls.Add(ctl); 

// want to inject data into the control at this point 

StringWriter writer = new StringWriter(); 
HttpContext.Current.Server.Execute(page, writer, true); 
String renderedContent = writer.ToString(); 
return renderedContent; 

Je l'ai vu le @ScottGu ViewManager exemple où il ajoute un membre de données à chacun de ses UserControls et utilise la réflexion pour injecter une source de données dans ce membre avant le contrôle est rendu en HTML.

J'ai également vu Stefan Sedich's prendre l'exemple @ScottGu où il dérive un ViewManager<Control> générique qui permet la même chose mais évite le besoin de réflexion.

Par exemple, je voudrais être en mesure d'ajouter un paramètre à l'objet Request ou au QueryString dans le HttpContext avant de rendre l'UserControl.

Répondre

0

Avez-vous envisagé de créer une nouvelle classe de base de contrôle pour votre application qui hérite de l'objet UserControl, puis vos contrôles utilisateur personnalisés seraient basés sur cette classe au lieu du contrôle utilisateur. Vous pouvez ensuite créer des méthodes pour injecter des données dans les contrôles de la classe de base qui seraient accessibles à partir de vos contrôles.

public class DataDrivenUserControl : UserControl 
{ 
// implement stuff here 
} 

Vos commandes pourraient alors hériter de cette classe

DataDrivenUserControl ctl = (UDataDrivenUserControl)page.LoadControl(controlSpec); 
page.Controls.Add(ctl); 
ctl.InjectData(data);// or however you want to implement data injection methods 

plus en profondeur de inheritence Normalement, je woldn't recommandé pour une fonction, mais il pourrait fonctionner ici.

+0

Ce que vous suggérez est une solution réalisable, mais il me semble inélégant. De plus, il faut spécialiser UserControl, que j'essaie d'éviter. –

Questions connexes