親ページからのASP.NETユーザーコントロールの検証
-
05-07-2019 - |
質問
ボタンのあるasp.netページがあります。このボタンは、ユーザーコントロールを生成してページに挿入するため、多くのコントロールが1つのページに存在する可能性があります。生成されたコントロール内に特定の動的に生成されたコントロールが存在することを検証する必要があります。
So..Pageには0〜N Control1’ sがあります。各Control 1には、0〜N個のControl2を含めることができます。 [ページ]で[保存]ボタンをクリックすると、すべてのControl1内に少なくとも1つのControl2があることを確認する必要があります。
私は現在、2つのオプションの間にいます:
•生成される各コントロールにCustomValidatorsを動的に挿入します。それぞれが1つのControl1を検証します。
• (jQueryを使用して)検証を手動で行い、SaveButton.OnClientClickから検証関数を呼び出します。
どちらも独自の方法でずさんです–これが私がこれを皆さんと共有している理由です。簡単な解決策がありませんか?
事前に感謝..(ところで– .NET 3.5 SP1までは公正なゲームです)
解決
うーん、私はデジグルによって提案されたインターフェイスのアイデアが好きですが、コードが生きるためのより論理的な場所のように見えるので、サブコントロールの代わりにコンテナControl1のインターフェイスを使用します。私の意見はここにあります:
public interface IValidatableControl
{
bool IsValidControl();
}
次に、これをControl1に実装します
public class Control1 : IValidatableControl
{
... Other methods
public bool IsValidControl()
{
foreach(object c in this.Controls)
{
if(c.GetType() == "Control2")
return true;
}
return false;
}
}
これを書くにはおそらくもっと良い方法がありますが、始めるには十分なアイデアが得られるはずです。
他のヒント
ユーザーコントロールをその場で追加する場合、各コントロールにValidate関数を使用して同じインターフェイスを実装させることができます。これにより、ページ上の各親コントロールのプレースホルダーにコントロールをロードできます。ページが送信されると、プレースホルダー内のコントロールをループし、それらをインターフェイスクラスにキャストしてから、validate関数を呼び出します。カスタムバリデーターは使用していませんが、validate関数から返されたオブジェクトを使用して検証エラーのリストを作成できます。この検証エラーのコレクションを好きな方法でレンダリングできます。
Control2のIDの存在を参照するControl1のパブリックプロパティを割り当ててから、Control1のクラスをValidationPropertyで装飾することでそれができると思います。私はこれらの線に沿って何かを考えています:
[ValidationProperty("Control2Ref")]
public partial class Control1 : UserControl
{
public string Control2Ref
{
get { return FindControl("Control2"); }
}
// rest of control 1 class
}
そして、Control1のインスタンスでRequiredFieldValidatorを指すことができるはずです。
試すことができる方法の1つは、カスタムコントロール階層を表す単純なxml構造を作成して維持することです。カスタムユーザーコントロールを作成または破棄するたびに、この構造から挿入または削除します。保存時に、xml構造で表されるコントロール階層が正しいことを検証します。 Sessionオブジェクトにxmlを保存して、ポストバック間で永続化できます。