7

ボタン付きのasp.netページがあります。このボタンは、ユーザー コントロールを生成してページに挿入するため、1 つのページに多数のコントロールが存在する可能性があります。生成されたコントロール内に特定の動的に生成されたコントロールが存在することを検証する必要があります。

したがって、ページには 0 ~ N 個の Control1 があります。各コントロール 1 は、0 ~ N 個のコントロール 2 を持つことができます。Page で SaveButton をクリックすると、すべての Control1 内に少なくとも 1 つの Control2 があることを確認する必要があります。

私は現在、2つのオプションの間にあります:

• 生成されるコントロールごとに CustomValidators を動的に挿入します。それぞれが 1 つの Control1 を検証します。

• SaveButton.OnClientClick から検証関数を呼び出して、手動で (jQuery を使用して) 検証を行います。

どちらもそれぞれのやり方でずさんです。そのため、これを皆さんと共有しています。簡単な解決策がありませんか?

前もって感謝します.. (ところで – .NET 3.5 SP1 までのすべてが公正なゲームです)

4

4 に答える 4

8

うーん、digigur によって提案されたインターフェイスのアイデアが好きですが、コードが存在するより論理的な場所のように思われるため、サブ コントロールの代わりにコンテナー 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;
    }

}

これを書くにはもっと良い方法があるかもしれませんが、始めるのに十分なアイデアが得られるはずです。

于 2008-11-01T23:30:42.420 に答える
2

その場でユーザー コントロールを追加する場合は、各コントロールに Validate 関数を使用して同じインターフェイスを実装させることができます。そうすれば、ページ上の各親コントロールのプレースホルダーにコントロールを読み込むことができます。ページが送信されると、プレースホルダー内のコントロールを単純にループし、それらをインターフェイス クラスにキャストしてから、検証関数を呼び出します。カスタムバリデーターは使用しませんが、検証関数から返されたオブジェクトを使用して検証エラーのリストを作成できます。この検証エラーのコレクションを好きな方法でレンダリングできます。

于 2008-11-01T18:56:18.323 に答える
1

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 を指すことができるはずです。

于 2008-11-21T16:39:35.717 に答える
0

試すことができる 1 つの方法は、カスタム コントロール階層を表す単純な xml 構造を作成して維持することです。カスタム ユーザー コントロールを作成または破棄するたびに、この構造体から挿入または削除します。保存時に、xml 構造で表されるコントロール階層が正しいことを検証します。xml を Session オブジェクトに保存して、ポストバック間で永続化することができます。

于 2008-11-01T18:36:13.903 に答える