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

时间:2010-04-27 19:41:25

标签: 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();

    RenderEndTag(writer);
}

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

我见过其他人的代码:

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

这会阻止我的控件实例之间的命名冲突,但是如果我已经在页面上的其他地方创建了一个巧合具有相同ID的div呢?

我也听说过实现INamingContainer。这适用于此吗?我怎么能用它?

更新

我通过覆盖CreateChildControls并添加实际控件来解决这个问题,而不是直接渲染HTML。在那种情况下,INamingContainer完成它的工作。但是,如果有办法解决我原来的问题(直接渲染元素的唯一ID),我仍然很好奇。

3 个答案:

答案 0 :(得分:0)

INamingController是一个标记接口。实现它将保证您为每个控件实例提供唯一的ID。

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

  public class MyScriptControl: ScriptControl, INamingContainer {

  }

答案 1 :(得分:0)

您不希望仅为获取唯一ID而创建控件实例,这种方法的开销/复杂性无用。 Control.ID属性可能不唯一,但Control.ClientID属性将是唯一的。因此

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

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

答案 2 :(得分:0)

我试图意识到你的问题:

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有不同的ClientID。所以它不是ASP.NET问题。看看你的认识。可能是在将ScriptControls添加到Page之前为div生成id,或者您可能尝试在一个ScriptControl的范围内创建2个div,或者可能是您在async-posback上动态创建ScriptConrol2并且它具有与ScriptControl1相同的ID,即没有在回发上动态添加。