我有大量.aspx
个页面(asp.net 4,c#),这些页面都继承自自定义基页类(继承自System.Web.UI.Page类)。
按照惯例,所有这些页面都有相同的控件集(例如,几个具有相同ID的文本框)。
我想在自定义基页类中放入一些通用代码,以从页面上的这些控件中检索.Text
值。
请注意,这不是MasterPage设置。我有一个自定义基页类,然后是一系列从该基页类继承的页面。
如何从基类引用页面上的文本框?
答案 0 :(得分:2)
如果按惯例它们都有相同的控件集,为什么不将控件移动到基类?
或者,您可以创建一个包含公共控件集的接口,然后在所有aspx.cs代码隐藏中实现该接口。这将允许您有一些违反惯例的aspx页面。您可以在基类中将“this”转换为接口,如果它不为null,则修改控件。例如:
IControlSet controlSet = this as IControlSet;
if(controlSet != null)
{
controlSet.Name.Text = "someName";
}
答案 1 :(得分:2)
您可以做的一件事是在基类上放置一个抽象方法或属性。这将强制继承者实现此方法,并且基础可以可靠地调用它。
protected abstract TextBox MyTextBox { get; }
然后你所有继承的页面都必须实现这个方法,理想情况下会返回它们的MyTextBox。
您可以创建一个如上定义的接口,或者只创建另一个继承自其他Base的PageBase,该BaseB表示具有该组控件的页面。
修改强>
作为实施的一个例子。假设基类名为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";
如果您只想修改文本或其他特定属性,那么更好地将其封装起来更为理想,并且只为特定文本框中的text属性提供getter / setter。该示例不允许您更改文本框的实际实例,但它允许您访问和修改其任何属性。
答案 2 :(得分:2)
您应该可以使用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;
}