如何修改所有ASP.NET控件从我的特殊控件继承?
问题描述:
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" />
将是有效的。
答
您不能更改属于BCL一部分的控件的继承链。
+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);
}
}
答
一件事你可以做的是下面创建一个扩展方法。
<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
尝试更新web.config通过为tagPrefix =“asp”提供其他程序集关联来控制该部分,但是我不确定它是否会更新类后面的代码以及是否需要源代码为 – sll