4

我有大量的.aspx页面(asp.net 4,c#)都继承自自定义基页面类(继承自 System.Web.UI.Page 类)。

按照惯例,所有这些页面上都有相同的控件集(例如几个具有相同 ID 的文本框)。

我想将一些通用代码放在自定义基页面类中,该类.Text从页面上的这些控件中检索值。

请注意,这不是 MasterPage 设置。我有一个自定义基页类,然后是从该基页类继承的一系列页面。

如何从基类引用页面上的文本框?

4

3 回答 3

3

您应该能够使用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;
}
于 2012-05-11T20:34:01.353 回答
2

如果按照惯例它们都有相同的控件集,为什么不将控件移到基类中呢?

或者,您可以创建一个包含通用控件集的接口,然后在您的所有 aspx.cs 代码隐藏中实现该接口。这将允许您拥有一些违反惯例的 aspx 页面。您可以将“this”作为接口,在基类中,如果它不为空,则修改控件。例如:

IControlSet controlSet = this as IControlSet;

if(controlSet != null)
{
    controlSet.Name.Text = "someName";
}
于 2012-05-11T20:20:59.460 回答
2

您可以做的一件事是在基类上放置一个抽象方法或属性。这将迫使继承者实现此方法,并且基础可以可靠地调用它。

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。该示例不允许您更改文本框的实际实例,但它允许您访问和修改其任何属性。

于 2012-05-11T20:23:21.623 回答