0

次の問題が発生しました。

フレームワークには IsMustField プロパティを持つ Web コントロールがいくつかあります。このプロパティが設定されている場合、CreateChildControls メソッドは一部の CSS を変更し、コントロールに JS Validator を追加します。ここまでは順調ですね。今、私はごく一般的なコントロールを実装しようとしています。テキストフィールドの一部は、あるケースでは必須フィールドですが、他のケースではそうではありません。フィールドが必須フィールドであるかどうかの決定は、Control の OnLoad メソッドで行われます。

最初にページを開いたときは、すべて問題ありません。保存してポストバックが完了するとすぐに、ページが読み込まれます。IsMustField フィールドの初期値は、ascx の値で設定されます (この場合は true)。次に、初めて ProcessPostData を呼び出します。これにより、EnsureChildControls メソッドが呼び出されるため、コントロールの CreateChildControls メソッドが呼び出されます。CSS と JS Validator がこのメソッドにアタッチされているため、コントロールが必須フィールドであるかのように、それらが追加されます。その後、ジェネリック コントロールの OnLoad メソッドが呼び出され、IsMustField が false に設定されます。しかし、既に CreateChildControls メソッドが呼び出されているため、これはもはや望ましい効果をもたらしません。

ここで私の質問は次のようになります: ProcessPostData を最初に試して 2 回目だけ呼び出して、ジェネリック コントロールが IsMustField を false に設定した後にコントロールをロードすることを何らかの方法で抑制することは可能ですか? または、別の解決策を探す必要がありますか。ところで:私は実装がかなりくだらないことを知っています...しかし、フレームワークを変更してはならないので、他に選択肢はありません:)

皆さんが私を助けてくれることを願っています

よろしく、crazy_crank

4

1 に答える 1

0

2つのオプションがあるようです。ライフサイクルの早い段階でIsMustField値を設定するか、ライフサイクルの後半で「バリデーターの追加」動作を実行します。次にいくつかの例を示します。

ページライフサイクルの早い段階で「isMustField」を設定した場合(たとえば、Page_Init())、ProcessPostDataの前に実行されます。このアプローチは、isMustField-decisionの動作がユーザー入力に依存しないことを前提としています(ViewStateがロードされる前に発生するため)。

2番目のオプションは、ライフサイクルの後半まで待機して、JSバリデーターを適用するかどうかを決定することです。その機能を(CreateChildControlsではなく)Page_PreRenderに移動すると、どのコントロールがIsMustField = trueであるかを決定する前に、ページはビューステートとイベントを完全に処理する機会を得ます。

ページライフサイクルについては、このMSDNの記事を参照してください。IMO、強力なASP.NET開発者になることは、あなたができる唯一の最善のことです。:)

于 2012-07-02T14:26:10.987 に答える