2009-02-27 4 views
0

J'ai utilisé ExpressionBuilders ici et là dans mon balisage asp.net pour retourner des types de données simples.asp.net ExpressionBuilder: Possible de câbler un événement?

Est-ce que quelqu'un a des idées sur la façon dont un ExpressionBuilder peut être utilisé pour connecter un événement en ligne? Ou ExpressionBuilders peut-il seulement renvoyer des littéraux?

Je voudrais câbler l'événement OnLoad (ou tout autre événement) en créant un ExpressionBuilder (nommé AutoBind dans mon exemple). Des idées si cela peut être fait?

<asp:DropDownList ID="DropDownList1" runat="server" 
    DataSource='<%# GetRecords() %>' 
    DataTextField="Name" DataValueField="ID" 
    OnLoad="<%$ AutoBind: this.DataBind() %>" /> 
+0

Vous ne savez pas exactement ce que vous tentez d'accomplir ici avec Expression Builders. Ne connaissez-vous pas le nom de l'événement au moment de la compilation? L'événement Load pour DropDownList va-t-il changer? Quelle est votre raison de choisir pour les constructeurs d'expression. À ma connaissance Expression Builders retour ** Valeurs littérales ** –

+0

Je suppose que c'est ce que je recherchais. Idéalement, il s'agit de définir ceci de façon déclarative, mais peut-être que ce n'est pas possible. Je sais que je pourrais étendre le contrôle, mais je voulais le faire à travers un grand nombre de contrôles. – andleer

Répondre

2

Sam est correct. Les expressions ne peuvent être définies que sur les propriétés, elles ne câbleront pas d'événement. Je suis "proche" en faisant cela avec le constructeur d'expression.

[System.Web.Compilation.ExpressionPrefix("Delegate")] 
    public class DelegateExpressionBuilder : ExpressionBuilder 
    { 
     public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context) 
     {   

     return new CodeDelegateCreateExpression(new CodeTypeReference("System.EventHandler"), null, entry.Expression); 
     } 
    } 

Dans la marque de la page que vous souhaitez écrire quelque chose comme ça ...

<asp:DropDownList runat="server" onload='<%$ Delegate:(o,e) => { this.DataBind(); } %>' /> 

Le problème est que le compilateur va générer ce.

((System.Web.UI.IAttributeAccessor)(@__ctrl)).SetAttribute("onload", System.Convert.ToString(new System.EventHandler((o,e) => { this.DataBind(); }), System.Globalization.CultureInfo.CurrentCulture)); 

C'est essentialy « convertir » le délégué à une chaîne et, en réalité, vous voulez que le compilateur de le faire ...

@__ctrl.Load += new System.EventHandler((o,e) => { this.DataBind(); }); 
0

au lieu d'utiliser le constructeur d'expression, vous pouvez appeler l'une des méthode d'événement défini dans votre code qui a la signature reuqired du gestionnaire d'événements

dans les arguments de l'événement poignée d'événement, vous pouvez identifier l'objet et les données et manipuler le contrôle comme vous voulez

+0

Certainement mais l'idée ici est de le faire en balisage si possible. – andleer

0

Je pense que je comprends ce que vous essayez de faire ici, corrigez-moi si je me trompe. Il semble que vous souhaitiez coder le gestionnaire lui-même dans le cadre de l'expression, c'est-à-dire lorsque Load Load pour la liste déroulante, vous voulez que DataBind() soit appelé.

Il n'est tout simplement pas légal d'utiliser une expression dans ce contexte en premier lieu. Les expressions ne peuvent être utilisées que pour définir les propriétés publiques sur l'instance de contrôle - OnLoad n'est pas une propriété publique mais un hook d'événement généré par l'analyseur à partir des événements publics du contrôle.

Si vous définissez une expression sur un hook d'événement tel que OnLoad, vous obtiendrez une erreur de compilation comme ceci: Le type 'System.Web.UI.WebControls.DropDownList' n'a pas de propriété publique nommée 'OnLoad'.

De plus, les générateurs d'expression ne renvoient pas seulement des littéraux - ils retournent des expressions, d'où le nom. Une expression dans ce contexte signifie une expression CodeDom qui représente le code qui sera exécuté lors de l'exécution de la page, dans le cadre de l'affectation de la propriété cible.

Par exemple, cette expression connectionStrings:

< asp: Literal Text = "<% ConnectionStrings de $: myConnection%>" />

retourne une expression CodeDom qui ressemble à ceci dans une page compilée:

control.Text = ConnectionStringsExpressionBuilder.GetConnectionString ("myConnection");

Questions connexes