2010-04-27 48 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,即未在回發中動態添加。

相關問題