質問

ボタンのある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を保存して、ポストバック間で永続化できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top