0

C#ASPアプリケーションのフォーム検証コントロールを構築しています。作業の大部分は、検証出力のマークアップも持つBaseValidatorコントロール(サブクラス化System.Web.UI.UserControl)によって処理されます。次に、これは、Validateメソッドとそのバリデーターコントロールに必要な追加フィールドを提供するPasswordValidatorなどのサブコントロールによって拡張されます。

(最終的な目標は、<uc1:PasswordValidator ControlId = "txtPassword" />のようなコントロールを用意することです。これにより、最小限の重複で任意の形式に展開できます。)

ただし、PasswordValidator.ascx.csは、BaseValidator.ascxで定義されているフォーム要素にアクセスできません。私がそうすることを見つけた唯一の方法は、各サブコントロールの*.ascxファイルにマークアップを複製することです。BaseValidator.ascx.csを拡張し、サブクラスのBaseValidator.ascxのマークアップにアクセスするにはどうすればよいですか?

4

3 に答える 3

0

これを実現するには、サーバーコントロールを作成する必要があると確信しています。つまり、.ascxファイルではなく、コントロール内のコードから出力されたマークアップを生成する必要があります。

于 2010-01-29T21:47:08.463 に答える
0

PasswordValidatorが拡張するBaseValidatorコントロールの真のベースクラスがある場合、ベースクラス内のすべてのマークアップ/コントロールは、保護されたプロパティを介して利用できる必要があります。私は、真のベースにascx部分を含めるべきではないと主張することさえします。基本クラスは、コントロールをオンザフライで構築するためのメソッドとプロパティを提供する必要があります(おそらく、ビューステートを維持するためにPage_Init中に)。

同じページに2つの別々のコントロールがある場合は、親ページを変更して、そのような通信を可能にする仲介方法を提供できます。

PasswordValidatorがあり、コントロール/マークアップだけが必要な場合は、LoadControlメソッドを使用して、メモリ内にBaseControlのインスタンスを作成し、プログラムでそのコントロール/マークアップにアクセスして、実行する内容に応じて追加または破棄できます。それと。

それを除けば、@Shawnが言った通りです。サーバーコントロール。

于 2010-01-29T22:02:07.307 に答える
0

提案をありがとう。

サービスと戦略パターンを使用してこれを解決しました。任意のユーザーインターフェイスの検証を提供する中央のFieldValidatorクラスがあります。Webインターフェースの場合、これらのメソッドはWebServiceおよび(WebServiceを介して)UserControlを介して公開されます。フォームとWebServiceの間に立つUserControlクラスが1つしかないため、ページ要素へのアクセスに問題はありません。

たとえば、<uc1:FieldValidator ControlType="Password" ControlToValidate="txtPassword" runat="server" >コードビハインドを必要とせずに、完全に機能するクライアント側とサーバー側の検証を実行します。素晴らしい!:)

(質問への回答でしばらく前に解決策について言及しましたが、それを回答済みとしてマークすることはできません。)

于 2010-03-17T04:57:00.717 に答える