我正在创建一个基于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),我仍然很好奇。
答案 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,即没有在回发上动态添加。