在asp.net中如何引用自定义基页类中的页面控件

时间:2012-05-11 20:15:13

标签: asp.net

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

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

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

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

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

3 个答案:

答案 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;
}