2012-05-11 53 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; 
} 
相關問題