2010-04-27 3 views
2

Je crée un contrôle basé sur ScriptControl, et je suis redéfinissant la méthode Render comme ceci:Assurer attribut d'identification unique pour les éléments au sein ScriptControl

protected override void Render(HtmlTextWriter writer) 
{ 
    RenderBeginTag(writer); 

    writer.RenderBeginTag(HtmlTextWriterTag.Div); 
    writer.Write("This is a test."); 
    writer.RenderEndTag(); 

    RenderEndTag(writer); 
} 

Ma question est, si je veux attribuer le div un attribut ID et qu'il soit unique sur la page, même s'il y a plusieurs instances de mon contrôle?

J'ai vu le code d'autres personnes qui fait cela:

writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID + "_divTest"); 

Cela permettra d'éviter les conflits de noms entre les instances de mon contrôle, mais si je l'ai déjà créé un div ailleurs sur la page qui a par hasard le même ID?

J'ai également entendu parler de l'implémentation de INamingContainer. Est-ce que cela s'appliquerait ici? Comment pourrais-je l'utiliser?

MISE À JOUR:

J'ai travaillé autour en surchargeant CreateChildControls et l'ajout de contrôles réels, par opposition à rendre HTML directement. Dans ce cas, INamingContainer fait son travail. Cependant, je suis toujours curieux de savoir s'il existe un moyen de résoudre mon problème d'origine (ID uniques pour les éléments rendus directement).

Répondre

0

INamingController est une interface de marqueur. Sa mise en œuvre vous garantira des identifiants uniques pour chaque instance de votre contrôle.

http://msdn.microsoft.com/en-us/library/system.web.ui.inamingcontainer.aspx

public class MyScriptControl: ScriptControl, INamingContainer { 

    } 
+0

I mis en œuvre INamingContainer et essayé d'ajouter un attribut ID: writer.AddAttribute (HtmlTextWriterAttribute.Id, "divTest"); Mais lorsque j'ai instancié deux de mes contrôles, le div avait le même ID dans les deux. Peut-être que c'est parce que la div n'est pas un contrôle des enfants. MSDN indique "tous les attributs d'ID de contrôle enfant sont garantis être uniques." –

+0

Comment instanciez-vous? Si j'ai deux zones de texte sur la même page avec le même identifiant, ce sera un conflit de nommage. Si j'ai une texbox sur la page avec ID TextBox1 et un dans un contrôle utilisateur imbriqué (WebUserControl1) avec l'ID TextBox1, les identifiants générés sont garantis être uniques - TextBox1 et WebUserControl1_TextBox1 –

+0

J'ai ajouté deux de mes ScriptControls avec des ID différents à une page utiliser le concepteur (glisser-déposer). Les divs rendus dans chacun sortent avec le même ID.Le problème est que je n'ajoute pas de contrôle enfant à un contrôle utilisateur; Je rends manuellement un div dans un contrôle serveur en utilisant un TextWriter. –

0

Vous ne voulez pas créer des instances de contrôle juste pour obtenir Ids uniques, il y a les frais généraux/complexité inutile dans cette approche. La propriété Control.ID peut ne pas être unique, mais la propriété Control.ClientID sera unique. Par conséquent

writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID + "_divTest"); 

cet attribut doit être unique, sauf si vous utilisez le suffixe « _divTest » deux fois dans votre contrôle personnalisé.

0

J'ai essayé de réaliser votre problème:

public class SC : ScriptControl 
{ 
    protected override IEnumerable<ScriptDescriptor> GetScriptDescriptors() 
    { 
     return null; 
    } 
     protected override IEnumerable<ScriptReference> GetScriptReferences() 
     { 
      return null; 
     } 
    } 
    //... Page code 
     protected void Page_PreRender(object sender, EventArgs e) 
     { 
      var sc = new SC(); 
      var sc1 = new SC(); 
      Page.Form.Controls.Add(sc); 
      Page.Form.Controls.Add(sc1); 
     } 

Mais sc et SC1 ont différentes ClientID. Ce n'est donc pas un problème ASP.NET. Regardez par-dessus votre réalisation. Peut-être générez-vous des ids pour divs avant d'ajouter ScriptControls to Page, ou essayez-vous de créer 2 divs dans le cadre d'un ScriptControl, ou vous pouvez créer ScriptConrol2 dynamiquement sur async-posback et avoir le même id que ScriptControl1, pas ajouté dynamiquement sur la publication.

Questions connexes