2012-05-11 50 views
3

我有大量的.aspx页面(asp.net 4,c#),它们都从自定义基页面类(继承自System.Web。 UI.Page类)。在asp.net中如何引用自定义基页面类中的页面控件

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

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

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

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

回答

2

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

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

IControlSet controlSet = this as IControlSet; 

if(controlSet != null) 
{ 
    controlSet.Name.Text = "someName"; 
} 
+2

因为它是一个类,而不是具有相应标记的页面。 –

+0

页面的控件作为类中的代码存在。无论他们是否在基础课程中都没关系。 –

2

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

protected abstract TextBox MyTextBox { get; } 

那么你所有的继承页面将不得不实现这个方法,理想情况下会返回他们的MyTextBox。

您可以创建一个如上定义的接口,或者只是让另一个PageBase从您的另一个Base继承,这个BaseBase表示具有该控件集合的页面。

编辑:

作为实施方案的实例。假设基类被称为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方法。该示例不允许您更改文本框的实际实例,但它允许您访问和修改其任何属性。

+0

它不会强制用户在标记中声明'TextBox',尽管... –

+0

因此,他们可以做一些愚蠢的事情,例如不在标记中返回新的文本框,但这将是开发人员故意采取的行为,错误。使用FindControl可行,但它不会强制开发人员将正确的ID放在文本框上,并且没有编译时检查。我提出的实现,假设文本框是在标记上定义的,并且是部分的一部分,他们可以返回控件本身的引用而不执行查找 –

+0

我希望看到完整的示例。每个页面都有它自己的'designer.cs'文件,所以我不明白这是如何工作的... –

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; 
} 
相关问题