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)
Je ne sais pas si je comprends bien, mais pensez-vous qu'une HiddenField peut être d'une quelconque utilité dans votre Cas? – gbs
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