2 Stimmen

Sicherstellung eines eindeutigen ID-Attributs für Elemente innerhalb von ScriptControl

Ich erstelle ein Steuerelement, das auf ScriptControl basiert, und ich überschreibe die Render Methode wie folgt:

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

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

    RenderEndTag(writer);
}

Meine Frage ist, was, wenn ich das Div ein ID-Attribut zuweisen möchten und haben es eindeutig auf der Seite, auch wenn es mehrere Instanzen meiner Steuerung sind?

Ich habe den Code anderer Leute gesehen, der dies tut:

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

Das verhindert Namenskonflikte zwischen Instanzen meines Steuerelements, aber was ist, wenn ich bereits ein div an anderer Stelle auf der Seite erstellt habe, das zufällig die gleiche ID hat?

Ich habe auch von der Implementierung von INamingContainer gehört. Würde das hier zutreffen? Wie könnte ich es verwenden?

UPDATE :

Ich habe dieses Problem durch Überschreiben von CreateChildControls und das Hinzufügen tatsächlicher Steuerelemente, im Gegensatz zum direkten Rendern von HTML. In diesem Fall erfüllt INamingContainer seine Aufgabe. Allerdings bin ich immer noch neugierig, wenn es eine Möglichkeit, mein ursprüngliches Problem (eindeutige IDs für direkt gerenderte Elemente) zu lösen.

0voto

Raj Kaimal Punkte 8279

INamingController ist eine Marker-Schnittstelle. Ihre Implementierung garantiert Ihnen eindeutige IDs für jede Instanz Ihres Steuerelements.

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

  public class MyScriptControl: ScriptControl, INamingContainer {

  }

0voto

internet man Punkte 840

Sie werden nicht wollen, um Instanzen von Steuerelementen zu erstellen, nur um eindeutige Ids zu erhalten, gibt es nutzlos Overhead/Komplexität in diesem Ansatz. Die Control.ID-Eigenschaft ist vielleicht nicht eindeutig, aber die Control.ClientID-Eigenschaft wird eindeutig sein. Daher

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

Dieses Attribut muss eindeutig sein, es sei denn, Sie verwenden das Suffix "_divTest" zweimal in Ihrem benutzerdefinierten Steuerelement.

0voto

chapluck Punkte 569

Ich bin bemüht, Ihr Problem zu erkennen:

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);
        }

Aber sc und sc1 haben unterschiedliche ClientID. Es ist also kein ASP.NET-Problem. Sehen Sie sich Ihre Realisierung an. Vielleicht generieren Sie IDs für Divs, bevor Sie ScriptControls zur Seite hinzufügen, oder vielleicht versuchen Sie, 2 Divs im Bereich eines ScriptControls zu erstellen, oder vielleicht erstellen Sie ScriptControl2 dynamisch bei asynchronem Postback und es hat die gleiche ID wie ScriptControl1, das nicht dynamisch bei Postback hinzugefügt wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X