2010-01-29 35 views
0

我正在構建我們的C#ASP應用程序的表單驗證控件。大部分工作由BaseValidator控件(子類System.Web.UI.UserControl)處理,該控件也具有驗證輸出的標記。然後通過像PasswordValidator這樣的子控制來擴展它,它提供Validate方法和該驗證器控件所需的任何額外字段。ASP:擴展控件(ASCX)和訪問基類標記文件從子類代碼

(最終目標是具有像< UC1控制:PasswordValidator控件ID =「txtPassword」/>,我們可以撲通到任何形式與最小重複)

然而,PasswordValidator.ascx.cs不能訪問在BaseValidator.ascx中定義的表單元素;我發現這樣做的唯一方法是在每個子控件的* .ascx文件中複製標記。我如何擴展BaseValidator.ascx.cs並在子類中訪問BaseValidator.ascx的標記?

回答

0

感謝您的建議。

我使用服務和策略模式解決了這個問題。有一箇中央的FieldValidator類,它爲任何用戶界面提供驗證。對於Web界面,這些方法通過WebService和(通過WebService)UserControl公開。訪問頁面元素沒有問題,因爲現在只有一個UserControl類位於表單和WebService之間。

例如,<uc1:FieldValidator ControlType="Password" ControlToValidate="txtPassword" runat="server" >會撲通一聲倒全功能的客戶機側和服務器端驗證,而無需後面的代碼。大! :)

(我在回答我的問題時提到了分辨率,但我不能將其標記爲已回答。)

0

我敢肯定,您將不得不創建服務器控件來完成此操作。也就是說,您需要從控件中的代碼而不是.ascx文件中生成輸出的標記。

0

如果你有你的BaseValidator控制一個真正的基類,你的PasswordValidator延伸,那麼任何標記/在基類的控制應該是可以通過的保護性能。我甚至會說,一個真正的基地不應該有一個ascx部分。基類應該提供公開控件的方法和屬性以實時構建(可能在Page_Init期間維護視圖狀態)。

如果你有在同一頁上2所獨立的控制,你的父頁面可以被修改,以提供經紀方法來允許這樣的通信。

如果您擁有PasswordValidator,並且您只需要控件/標記,則可以使用LoadControl method在內存中創建BaseControl的實例,以編程方式訪問其控件/標記,並根據您的需求添加或刪除它想用它做。

如果不出這一點,那將是一樣@Shawn說。服務器控件。