我有大量的.aspx
页面(asp.net 4,c#)都继承自自定义基页面类(继承自 System.Web.UI.Page 类)。
按照惯例,所有这些页面上都有相同的控件集(例如几个具有相同 ID 的文本框)。
我想将一些通用代码放在自定义基页面类中,该类.Text
从页面上的这些控件中检索值。
请注意,这不是 MasterPage 设置。我有一个自定义基页类,然后是从该基页类继承的一系列页面。
如何从基类引用页面上的文本框?
我有大量的.aspx
页面(asp.net 4,c#)都继承自自定义基页面类(继承自 System.Web.UI.Page 类)。
按照惯例,所有这些页面上都有相同的控件集(例如几个具有相同 ID 的文本框)。
我想将一些通用代码放在自定义基页面类中,该类.Text
从页面上的这些控件中检索值。
请注意,这不是 MasterPage 设置。我有一个自定义基页类,然后是从该基页类继承的一系列页面。
如何从基类引用页面上的文本框?
您应该能够使用Page.FindControl("ControlID")
.
从你的基类:
var txt = Page.FindControl("TextBox1") as TextBox;
if (txt != null)
{
//found the textbox
//...
}
根据控件所在的窗体位置,特别是如果它们位于实现INamingContainer
接口的容器中,您可能需要创建一个FindControl()
可以遍历控件层次结构的递归方法。
public Control FindControlRecursive(Control root, string id)
{
if (root.ID == id)
return root;
foreach (Control control in root.Controls)
{
Control foundControl = FindControlRecursive(control, id);
if (foundControl != null)
return foundControl;
}
return null;
}
如果按照惯例它们都有相同的控件集,为什么不将控件移到基类中呢?
或者,您可以创建一个包含通用控件集的接口,然后在您的所有 aspx.cs 代码隐藏中实现该接口。这将允许您拥有一些违反惯例的 aspx 页面。您可以将“this”作为接口,在基类中,如果它不为空,则修改控件。例如:
IControlSet controlSet = this as IControlSet;
if(controlSet != null)
{
controlSet.Name.Text = "someName";
}
您可以做的一件事是在基类上放置一个抽象方法或属性。这将迫使继承者实现此方法,并且基础可以可靠地调用它。
protected abstract TextBox MyTextBox { get; }
那么您所有继承的页面都必须实现此方法,并且理想情况下会返回它们的 MyTextBox。
您可以创建一个如上定义的接口,或者只是创建另一个 PageBase,它从您的另一个 Base 继承来表示具有该组控件的页面。
编辑:
作为实现的一个例子。假设基类名为 MyPageBase 并且 HomePage.aspx 上有一个 ID="TextBox1" 的文本框
在基础上定义抽象属性
public abstract class MyPageBase : Page
{
protected abstract TextBox MyTextBox { get; }
}
在页面上:
public partial class HomePage : MyPageBase
{
protected override TextBox MyTextBox
{
get
{
return this.TextBox1;
}
}
}
在基础中,您可以访问该属性,因为它的抽象就像一个接口一样工作并且必须实现。然后假设继承人遵守合同,基地可以访问此属性。
this.MyTextBox.Text = "Change the text";
如果您只想修改文本或其他特定属性,最好更好地封装它并仅为特定文本框上的文本属性提供 getter/setter。该示例不允许您更改文本框的实际实例,但它允许您访问和修改其任何属性。