2010-04-27 49 views
2

我创建基于ScriptControl的控制,而我重写Render方法是这样的:确保为元素的唯一ID属性中ScriptControl的

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

这将阻止我控制的实例之间的命名冲突,但如果我已经是巧合有在页面上创建一个div别处相同的ID?

我也听说过实施INamingContainer。这适用于这里吗?我怎么用它?

UPDATE

我解决此通过重写CreateChildControls和增加实际控制,而不是直接渲染HTML工作。在那种情况下,INamingContainer会完成它的工作。不过,我仍然好奇是否有办法解决我原来的问题(直接渲染元素的唯一ID)。

回答

0

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

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

public class MyScriptControl: ScriptControl, INamingContainer { 

    } 
+0

我实现了INamingContainer并尝试添加一个ID属性: writer.AddAttribute(HtmlTextWriterAttribute.Id,“divTest”); 但是当我实例化我的两个控件时,div在两个中都有相同的ID。也许这是因为div不是儿童控制。 MSDN说:“所有的孩子控制ID属性保证是唯一的。” – 2010-04-28 05:42:16

+0

你是如何实例化的?如果我在同一个页面上有两个文本框,并且具有相同的ID,那将是一个命名冲突。如果我在ID为TextBox1的页面上有一个texbox,而在嵌套的用户控件(WebUserControl1)中有一个id为TextBox1,则生成的id保证是唯一的 - TextBox1和WebUserControl1_TextBox1 – 2010-04-28 12:23:41

+0

我将两个带有不同ID的ScriptControl添加到页面使用设计器(拖放)。每个渲染的div都带有相同的ID。问题是我没有向用户控件添加子控件;我使用TextWriter手动渲染服务器控件中的div。 – 2010-04-28 14:06:50

0

你不会希望创建控件实例只是为了获得唯一的ID,还有这种办法无用开销/复杂性。 Control.ID属性可能不是唯一的,但Control.ClientID属性将是唯一的。因此,

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

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

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有不同的客户端ID。所以这不是ASP.NET问题。看看你的实现。可能是在为页面添加ScriptControls之前为div生成ids,或者您可能尝试在一个ScriptControl的范围内创建2个div,或者可能是在async-posback上动态创建ScriptConrol2,并且它具有与ScriptControl1相同的id,即未在回发中动态添加。

相关问题