我正在基于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)。
发布于 2010-04-27 19:53:42
INamingController是一个标记接口。实现它将保证您对控件的每个实例都具有唯一的it。
http://msdn.microsoft.com/en-us/library/system.web.ui.inamingcontainer.aspx
public class MyScriptControl: ScriptControl, INamingContainer {
}发布于 2010-05-12 20:01:08
您不希望仅仅为了获得唯一的in而创建控件的实例,在这种方法中存在无用的开销/复杂性。Control.ID属性可能不是唯一的,但Control.ClientID属性将是唯一的。因此
writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID + "_divTest"); 除非您在自定义控件中两次使用后缀"_divTest“,否则该属性必须是唯一的。
发布于 2010-05-12 22:19:18
我试着意识到你的问题:
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添加到页面之前为div生成id,也可能是尝试在一个ScriptControl的范围内创建2个div,或者是在异步偏置上动态地创建ScriptConrol2,并且它具有与ScriptControl1相同的id,而后者在回发时没有动态添加。
https://stackoverflow.com/questions/2724473
复制相似问题