2

我正在创建一个基于 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)。

4

3 回答 3

0

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

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

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

于 2010-05-12T20:01:08.920 回答
0

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

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

  public class MyScriptControl: ScriptControl, INamingContainer {

  }
于 2010-04-27T19:53:42.833 回答
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,即没有在回发时动态添加。

于 2010-05-12T22:19:18.743 回答