2009-04-14 72 views
4

我創建了一些Web用戶控件(.ascx文件)並將它們放入頁面中。用戶控件中有一些文本框,我希望頁面能夠直接訪問。ASP.NET:公開Web用戶控件的控件

將用戶控件中的這些TextBox暴露給包含用戶控件的頁面的最簡單方法是什麼(閱讀:最少時間)?

我知道的兩個選項是從頁面調用myUserControl.FindControl(id)(這是否甚至可以在頁面中工作?),並在用戶控件中編寫屬性以公開TextBox值。

看起來不理想。 FindControl()要求頁面知道用戶控件中文本框的ID,從而打破封裝並添加硬編碼的字符串,並且在用戶控件中編寫一堆屬性將非常耗時,因爲這些用戶中的文本框的數量控制。

沒有辦法將我的用戶控件中的這些文本框聲明爲public而不是受保護

回答

4

(撇開這一事實,什麼你描述本質上是最好的做法相反......顯而易見評論)

如果您正在使用Web應用程序類型的項目,你應該有一個設計師。每個UserControl的cs文件。這包含每個子控件的聲明,因此您可以將訪問修飾符更改爲public。

如果您使用的是網站類型項目,則應該轉換爲Web應用程序。 According to Microsoft(並由經驗支持),當您計劃編寫跨越單一代碼隱藏的大量代碼時,不會使用網站類型。

0

爲什麼不給你的用戶控件一個TextBoxes集合,將集合公開爲一個屬性,並且在Init()方法中,只需將所有文本框添加到集合中?

這樣,您就擁有了一個集合,您可以根據ID進行搜索,而無需依賴任何頁面邏輯,而只需公開一個屬性。如果你爲它創建自己的集合類,你甚至可以用一些方便的方法編程,以便按照需要訪問文本框。

2

如果我必須這樣做,我會寫一個暴露控件的公共屬性。但是,通常有一種方法可以重寫信息,從而不需要公開內部控制。如果您只需要該值,請創建一個返回值的屬性。如果您需要客戶端ID,可能創建一個公開值或事件的客戶端對象將解決問題。請記住,一旦你公開,你就會暴露合同,改變合同幾乎總是很痛苦。

0

從公共基類中派生所有Web用戶控件,並將此功能公開爲公共方法(或方法)。你的基類可以派生自UserControl(通常是.ascx的方式),而你的控件又可以從它派生出來。

然後,即使使用反射似乎有點工作,你只做了一次。如果文本框是動態的,並且你想避免硬編碼的話,這就是要走的路。

所以,如果你只是需要通過ID從母體獲取文本框的值,你可以添加類似下面給你的基類:

public string GetTextboxValue(string id) 
    { 
     string textValue = string.Empty; 
     Control ctl = FindControl(id); 
     if (ctl.GetType() == typeof(TextBox)) 
      textValue = ((TextBox)ctl).Text; 
     return textValue; 
    } 

我說走這路由與以前的建議使TextBox公開,因爲你真的只想從父文本中讀取文本值而不是將整個對象公開爲讀/寫。

1

您可以將其作爲背後代碼的屬性公開。你真的只能從代碼訪問它的屬性,而不是來自ASP.Net設計器。這是vb中的一個例子,它暴露了用戶控件上的DropDownList(並且,它可能不是最佳實踐,但它肯定會跳過編寫代碼以暴露子控件上的每個屬性):

''' <summary> 
''' This is the exposed DropDownList for this control. 
''' </summary> 
''' <value></value> 
''' <returns></returns> 
''' <remarks></remarks> 
Public ReadOnly Property DrowDownList() As DropDownList 
    Get 
     Return ddControlList 
    End Get 
End Property