2011-10-07 64 views
2

TextBox,Label,Panel,...都從Control繼承。如何修改所有ASP.NET控件從我的特殊控件繼承?

有沒有辦法從Control繼承並使ASP.NET控件繼承我的新控件?

例如,我有一個控制

public class SpecialControl : Control 
{ 
    public string Something { get; set; } 
} 

現在我希望所有的控件來繼承它,所以

<asp:TextBox ID="tb" runat="server" Something="hello" /> 

將是有效的。

+0

嘗試更新web.config通過爲tagPrefix =「asp」提供其他程序集關聯來控制該部分,但是我不確定它是否會更新類後面的代碼以及是否需要源代碼爲 – sll

回答

5

您不能更改屬於BCL一部分的控件的繼承鏈。

+0

實際的控制,改變繼承,並重新編譯。但據我所知,內置控件的源代碼不公開/可用。 –

0

正如Oded所述,您不能修改打包控件的繼承鏈。

你可以做的是爲打包控件創建包裝,並在包裝​​中實現自定義屬性和方法。下面是如何擴展文本框一個簡單的例子:

[DefaultProperty("Text")] 
[ToolboxData("<{0}:CustomTextBox runat=server></{0}:CustomTextBox>")] 
public class CustomTextBox: System.Web.UI.WebControls.TextBox 
{ 
    [Bindable(true)] 
    [DefaultValue("")] 
    public string Something 
    { 
     get 
     { 
      string something = (string)ViewState["Something"]; 
      return (something == null) ? String.Empty : something ; 
     } 
     set 
     { 
      ViewState["Something"] = value; 
     } 
    } 

    protected override void RenderContents(HtmlTextWriter output) 
    { 
     output.Write(Text); 
    } 
} 
2

一件事你可以做的是下面創建一個擴展方法。

<asp:TextBox id="tst" runat="server" Something="TestValue"></asp:TextBox> 

public static string GetSomething(this WebControl value) 
{ 
    return value.Attributes["Something"].ToString(); 
} 

我只測試了一個TextBox控件。可能不是理想的解決方案,因爲它不是強類型的,但會起作用。

+0

這不是我所需要的,但實際上非常有趣。 +1 – BrunoLM