2011-02-27 4 views
5

Je construis une fonctionnalité javascript personnalisée dans une commande ASP.NET existante. . Le usercontrol doit savoir sur une propriété du contrôle, il est niché dans Donc, j'ai fini par opter pour l'utilisation d'un attribut expando plutôt que d'une variable globale javascript comme ceci:Comment ajouter un attribut expando à un contrôle utilisateur?

Page.ClientScript.RegisterExpandoAttribute(Me.ClientID, "validatorsenabled", Me.ValidatorsEnabled) 

Cependant, bien que la expando est sortie Pour le client, le contrôle utilisateur lui-même n'a pas d'élément correspondant en HTML. Ainsi, le code JavaScript suivant qui est autogénéré par ASP.NET obtient un « objet est nul » erreur:

var ctl00_MainContentHolder_Payment_CreditCardInput1 = document.all ? document.all["ctl00_MainContentHolder_Payment_CreditCardInput1"] : document.getElementById("ctl00_MainContentHolder_Payment_CreditCardInput1"); 
ctl00_MainContentHolder_Payment_CreditCardInput1.validatorsenabled = "False"; 

je l'ai fait une petite enquête et a découvert this page indiquant que la mise en œuvre de l'interface IWebPart pourrait le faire, mais j'ai essayé avec pas de chance.

Existe-t-il un moyen de faire d'une sortie usercontrol une balise comme un contrôle serveur? Ou est la seule option de convertir le tout en un contrôle de serveur (ce qui va à l'encontre de la conception du site dans ce cas)?

Je suis ouvert à d'autres suggestions pour déclarer une propriété JavaScript partagée dans un contrôle utilisateur si quelqu'un a d'autres idées.

+0

Je ne sais pas si je comprends bien, mais pensez-vous qu'une HiddenField peut être d'une quelconque utilité dans votre Cas? – gbs

+0

Une idée intéressante. Un champ caché pourrait être contenu dans mon contrôle utilisateur, mais il reste à savoir comment le contrôle dans lequel il est contenu saura comment le champ caché est nommé. Gardez à l'esprit qu'il peut y avoir plus d'une instance d'un contrôle userc sur une page. – NightOwl888

Répondre

2

J'ai trouvé une meilleure solution après ma liste originale une

J'ai trouvé une solution de contournement.

Il semble (par l'absence de réponse et le manque de résultats lorsque je cherche le terme) que la grande majorité des gens ne sont pas conscients des attributs expando et de leur utilité. Vous savez, lorsque vous ajoutez des contrôles de validation à une page ASP.NET et que vous obtenez ce bloc de JavaScript plutôt volumineux en bas de la page qui définit un ensemble de propriétés (telles que enabled et errormessage)? Voilà ce dont je parle. Ils peuvent être affichés sur la page à l'aide de la méthode Page.ClientScript.RegisterExpandoAttribute(). Ils doivent essentiellement rendre votre balise HTML valide, tout en vous permettant d'ajouter des propriétés (significatives) supplémentaires à utiliser avec javascript. Ils sont ajoutés et peuvent être accessibles via le DOM HTML, mais ils ne sont pas réellement présents dans le HTML.

Quoi qu'il en soit, revenons à ma solution. J'ai simplement ajouté 2 contrôles littéraux à la commande usercontrol - un au tout début, et un à la toute fin, et dans le codebehind j'ai ajouté le balisage pour un élément de contrôle avec l'ID de la commande usercontrol (puisqu'une commande usercontrol n'en édite pas) . Ainsi, le balisage ressemble à ceci:

<%@ Control Language="VB" AutoEventWireup="false" CodeFile="CreditCardInput.ascx.vb" Inherits="BVModules_Controls_CreditCardInput" %> 
<asp:Literal ID="litControlBegin" runat="server" /> 

<!-- User Control Content Here --> 

<asp:Literal ID="litControlEnd" runat="server" /> 

Puis, en codebehind, je l'ai fait:

Me.litControlBegin.Text = String.Format("<div id=""{0}"" class=""creditcardinput"">", Me.ClientID) 
Me.litControlEnd.Text = "</div>" 

maintenant un élément existera dans le code HTML qui correspond à l'ID (ClientID) du UserControl. Ce qui me donne essentiellement un espace de noms unique pour ajouter des attributs expando - et un moyen pour les autres contrôles d'identifier facilement ces attributs et de les associer à mon user control. L'attribut expando est ensuite ajouté à l'aide de ce code:

Page.ClientScript.RegisterExpandoAttribute(Me.ClientID, "validatorsenabled", Me.ValidatorsEnabled) 

qui ne plante plus, grâce à l'élément HTML I ajoutés manuellement. Ce serait bien si la plomberie était là dans un contrôle utilisateur pour prendre soin de ce détail, comme c'est le cas avec un serveur de contrôle, mais cette solution de contournement est un substitut approprié.

meilleure solution

Comme toujours, lorsque vous devez recourir à la chaîne que vous devriez prendre l'analyse de plus près s'il y a une meilleure façon. Cette fois-ci, il y en avait une - remplacer la méthode Render (comme le ferait un contrôle serveur) et utiliser les méthodes intégrées sur HtmlTextWriter pour produire la sortie.

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter) 
    writer.AddAttribute(HtmlTextWriterAttribute.Id, Me.ClientID) 
    writer.RenderBeginTag(HtmlTextWriterTag.Div) 
    MyBase.Render(writer) 
    writer.RenderEndTag() 
End Sub 

C'est fonctionnellement équivalent au code dans mon autre solution - il produit une balise DIV avec l'ID de mon usercontrol. Toutefois, il ne nécessite pas de code supplémentaire pour être dans Page_Load comme l'a fait l'original, utilise mieux le cadre, et ne nécessite pas de mise en forme de chaîne ou de concaténation.

Maintenant, cette ligne ajoutera un attribut expando (en javascript) directement au usercontrol:

Page.ClientScript.RegisterExpandoAttribute(Me.ClientID, "validatorsenabled", Me.ValidatorsEnabled) 
Questions connexes