C# 确保ScriptControl中元素的唯一ID属性

C# 确保ScriptControl中元素的唯一ID属性,c#,asp.net,uniqueidentifier,htmltextwriter,scriptcontrol,C#,Asp.net,Uniqueidentifier,Htmltextwriter,Scriptcontrol,我正在基于ScriptControl创建一个控件,并覆盖Render方法,如下所示: protected override void Render(HtmlTextWriter writer) { RenderBeginTag(writer); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.Write("This is a test."); writer.RenderEndTag(); Ren

我正在基于ScriptControl创建一个控件,并覆盖Render方法,如下所示:

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

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

    RenderEndTag(writer);
}
我的问题是,如果我想分配div an ID属性并使其在页面上唯一,即使我的控件有多个实例,该怎么办

我见过其他人的代码可以做到这一点:

writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID + "_divTest");
这将防止控件实例之间的命名冲突,但如果我已经在页面的其他位置创建了一个恰好具有相同ID的div,该怎么办

我还听说过在INamingContainer中实现。这适用于这里吗?我怎么用呢

更新:


我通过重写CreateChildControls并添加实际控件来解决这个问题,而不是直接呈现HTML。在这种情况下,INamingContainer完成了它的工作。然而,我仍然很好奇是否有办法解决我最初的问题——直接渲染元素的唯一ID。

InAdminController是一个标记接口。实现它将保证控件的每个实例都有唯一的ID


InAdminController是一个标记接口。实现它将保证控件的每个实例都有唯一的ID


您不希望创建控件实例只是为了获得唯一的ID,这种方法会带来无用的开销/复杂性。Control.ID属性可能不唯一,但Control.ClientID属性将唯一。所以

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

除非在自定义控件中使用后缀_divTest两次,否则该属性必须是唯一的。

您不希望创建控件实例只是为了获得唯一ID,这种方法没有必要的开销/复杂性。Control.ID属性可能不唯一,但Control.ClientID属性将唯一。所以

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

该属性必须是唯一的,除非在自定义控件中使用后缀_divTest两次。

我试图了解您的问题:

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

但是sc和sc1有不同的客户ID。所以这不是ASP.NET的问题。回顾一下你的认识。可能是您在将ScriptControl添加到页面之前为div生成id,或者可能是您尝试在一个ScriptControl的范围内创建两个div,或者可能是您在async posback上动态创建ScriptConrol2,并且它与ScriptControl1具有相同的id,而不是在回发时动态添加的id。

我试图了解您的问题:

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

但是sc和sc1有不同的客户ID。所以这不是ASP.NET的问题。回顾一下你的认识。可能是在将ScriptControls添加到页面之前为div生成id,或者可能是尝试在一个ScriptControls的范围内创建两个div,或者可能是在async posback上动态创建ScriptControl2,并且它与ScriptControl1具有相同的id,没有在回发时动态添加。

我在MingContainer中实现并尝试添加ID属性:writer.AddAttributeHtmlTextWriterAttribute.ID,divTest;但是当我实例化两个控件时,div在两个控件中都有相同的ID。可能这是因为div不是子控件。MSDN说所有子控件ID属性都保证是唯一的。您如何实例化?如果我在同一页面上有两个具有相同id的文本框,这将是一个命名冲突。如果我在页面上有一个ID为TextBox1的texbox,在一个ID为TextBox1的嵌套用户控件WebUserControl1中有一个texbox,则生成的ID保证是唯一的-TextBox1和WebUserControl1textbox1i使用设计器拖放将两个具有不同ID的脚本控件添加到页面中。每个控件中呈现的div都具有相同的ID;我正在使用TextWriter手动呈现服务器控件中的div。您是对的。控件中的子控件保证具有唯一的UniqueID,这些ID在页面上是唯一的>>如果我已经在页面的其他位置创建了一个恰好具有相同ID的div,该怎么办?它仍然是唯一的,因为您将它与_divTest连接在一起。父id仍然是唯一的。我在MingContainer中实现并尝试添加id属性:writer.AddAttributeHtmlTextWriterAttribute.id,divTest;但是当我实例化两个控件时,div在两个控件中都有相同的ID。可能这是因为div不是子控件。MSDN说所有子控件ID属性都保证是唯一的。您如何实例化?如果我在同一页面上有两个具有相同id的文本框,这将是一个命名冲突。如果我在页面上有一个ID为TextBox1的texbox,在一个ID为TextBox1的嵌套用户控件WebUserControl1中有一个texbox,则生成的ID保证是唯一的-TextBox1和WebUserControl1textbox1i使用设计器拖放将两个具有不同ID的脚本控件添加到页面中。每个控件中呈现的div都具有相同的ID;我正在使用TextWriter手动呈现服务器控件中的div。您是对的。控件中的子控件
e保证在页面上有唯一的唯一ID>>如果我已经在页面的其他地方创建了一个恰好具有相同ID的div,该怎么办?它仍然是唯一的,因为您将它与_divTest连接在一起。父id仍然是唯一的。