3

2つのカスタムバリデーターを含むWebフォームがあります。

  • 文字列が日付であることを検証するための1つ。解析可能である限り、どの形式でも構いません。
  • もう1つは、ある日付が別の日付以上であることを確認するためのものです。比較バリデーターをどの日付形式でもうまく再生させることができませんでした。
<asp:TextBox ID="txtResourceStartDate" runat="server"
    CssClass="textBox mandatory dateField" />
<asp:CustomValidator ID="valResourceStartDateIsDate" runat="server"
    ControlToValidate="txtResourceStartDate" Display="None"
    ErrorMessage="Start date must be a valid date"
    OnServerValidate="Date_ServerValidate" />

<asp:TextBox ID="txtResourceEndDate" runat="server"
    CssClass="textBox mandatory dateField" />
<asp:CustomValidator ID="valResourceEndDateIsDate" runat="server"
    ControlToValidate="txtResourceEndDate" Display="None"
    ErrorMessage="End date must be a valid date"
    OnServerValidate="Date_ServerValidate" />

<asp:CustomValidator Display="None" Text="" ID="valForStartEndDate" runat="server"
    OnServerValidate="ValidateStartEndDate"
    ErrorMessage="Last day must be greater than or equal to first day" />
protected void Date_ServerValidate(object source, ServerValidateEventArgs args)
{
    DateTime outDate;
    args.IsValid = DateTime.TryParse(args.Value, out outDate);
}

protected void ValidateStartEndDate(object sender, ServerValidateEventArgs e)
{
    e.IsValid = DateTime.Parse(txtResourceEndDate.Text) >=
                DateTime.Parse(txtResourceStartDate.Text);
}

問題は、ValidateStartEndDateバリデーターがバリデーターの前にDate_ServerValidate起動しているため、日付が有効でない場合、フォーマット例外がスローされることDateTime.Parseです。明らかに、このバリデーターは解析する前に有効な日付をチェックできますが、適切なメッセージを含む個別のバリデーターが必要です。

だから問題はこれです:バリデーターが起動するシーケンスを決定するものは何ですか?何かが足りない場合を除いて、これはタグレベルで宣言されていません。

4

2 に答える 2

2

バリデーターが起動する特定のシーケンスを当てにすることはできません。また、そうすべきではありません。順序が無関係であることを自分で確認する必要があります。

だからあなたは

  1. Equal-Greater-Checkと同時に有効な日付を確認してください。
  2. 最初にIsDate-ValidatorのValidate()-関数を呼び出してから、IsValidかどうかを確認します
  3. すべてのバリデーターがPage.Validatorsコレクションに追加され、検証はこのコレクションを順番に実行します。ロジックが本当にこの順序に依存する必要がある場合:ASPXページのバリデーターの順序を変更します

ページ検証に関するいくつかの興味深い情報:http://msdn.microsoft.com/en-us/library/aa479045.aspx

于 2010-07-15T07:42:54.270 に答える
0

検証コントロールの実行順序は、によってValidatorCollection返されるコントロールの順序によって決定されPage.Validatorsます。この順序は、いくつかの例外を除いて、マークアップ内の検証コントロールの順序によって決定されます(たとえば、データバインドされたコントロール内のバリデーターは後でコレクションに追加されるため、最後に追加されます)。

ボタンを設定CausesValidation=falseしてから、を使用して手動で検証をトリガーすると、のメソッドとメソッドをPage.Validate使用して実行順序を変更できます。AddRemoveValidatorCollection

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) {
        // move myValidator to the very end, so it executes last
        Validators.Remove(myValidator);
        Validators.Add(myValidator);
    }
}

次に、トリガー制御で後で:

protected void myButton_Click(object sender, EventArgs e)
{
    Page.Validate();
    if (!Page.IsValid) { return; }

    // validation passed, proceed...
}

免責事項:これはすべて経験的なものであり、バックアップするMSDNドキュメントは見つかりませんでしたが、機能しているようです。

于 2014-06-09T16:44:20.903 に答える