web-dev-qa-db-ja.com

テキストボックスに対してasp.netカスタムバリデーターが起動しない

Texboxを検証するための必須フィールドバリデーターとカスタムバリデーターの両方があります。必要なフィールドバリデーターは完全に起動します。カスタムバリデーターを正しく起動させることができませんか?

<asp:TextBox ID="txtPRI" runat="server" Width="295" /><br />

<asp:RequiredFieldValidator display="Dynamic" CssClass="leftAlign" SetFocusOnError="true"  runat="server" controltovalidate="txtPRI" errormessage="Please enter your PRI" />

 <asp:CustomValidator runat="server" id="cusCustom" controltovalidate="txtPRI" onservervalidate="cusCustom_ServerValidate" Enabled="true" ValidateEmptyText="true" display="Dynamic" CssClass="leftAlign" SetFocusOnError="true"  errormessage="The text must be exactly 8 characters long!" />

コードビハインド

protected void cusCustom_ServerValidate(object sender, ServerValidateEventArgs e)
    {
        Response.Write("firing - test");
        Response.End();


        if (e.Value.Length == 8)
            e.IsValid = true;
        else
            e.IsValid = false;
    }
28
Eric Savard

空のテキストが検証されるように、CustomValidatorプロパティValidateEmptyTexttrueに設定されていることを確認してください。そうすればRequiredFieldValidatorはもう必要ありません。

編集:コードを取得して、それをコピーして空のプロジェクトに貼り付けたところ、期待どおりに動作しました。あなたが投稿していない、または間違って投稿しているものがあるに違いありません。検証をトリガーしているボタンまたは検証コントロール自体に影響するものは他にありますか?

編集:正確なコードは次のとおりです(コンテンツページにあります):

aspxページ:

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <asp:TextBox ID="txtPRI" runat="server" Width="295" /><br />
    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" display="Dynamic" CssClass="leftAlign" SetFocusOnError="true"  runat="server" controltovalidate="txtPRI" errormessage="Please enter your PRI" />  
    <asp:CustomValidator runat="server" id="cusCustom" controltovalidate="txtPRI" onservervalidate="cusCustom_ServerValidate" Enabled="true" ValidateEmptyText="true" display="Dynamic" CssClass="leftAlign" SetFocusOnError="true"  errormessage="The text must be exactly 8 characters long!" /> 
</asp:Content>

.csページ(空Page_Load):

protected void cusCustom_ServerValidate(object sender, ServerValidateEventArgs e)
{ 
    // put a break point here and it stops on it
    if (e.Value.Length == 8)
        e.IsValid = true;
    else
        e.IsValid = false;
} 
49
Kelsey

わかりました...まだ受け入れられていない本当に古い質問で、私は同じ問題に遭遇しました。

だから私はこの問題を抱えている可能性があり、答えが必要な他の人のためにそこに捨てます...

カスタムサーバー検証とともに定期的な検証を行っている場合、カスタムサーバー検証は、他のすべての検証が正常に戻った場合にのみ起動します。

18
Patrick

CustomValidatorでこのプロパティを設定することを忘れないでください...

ValidateEmptyText="True"
9
Remotec

上記の提案に加えて、新しいバージョンの.Netフレームワークでは、サーバーでvalidate()メソッドを明示的に起動してカスタムバリデータールーチンを取得する必要があることがわかりました

    // validate page before allowing import to go through
    Page.Validate();
    if (!Page.IsValid)
        return;
4
TedC

私もこの問題を抱えていました。はい、他のすべてのバリデーターはbeforeを渡す必要がありますCustomValidatorが発火します。

ただし、それがうまくいかない場合は、Page.Validate()を使用して特定の検証グループの検証を強制する必要がある場合があります。

これは私がやった方法であり、私はRequiredFieldValidatorを維持することができ、ValidateEmptyText="true"は必要ありませんでした。

テキストボックスにトラップを追加して、検証を強制します。

<asp:TextBox ID="txtLeft" runat="server" Width="110px" TextMode="SingleLine" style="text-align:center" OnTextChanged="TextBoxChanged_DateTimeTest" AutoPostBack="True" ValidationGroup="vg2"></asp:TextBox>

検証したくない他の領域があるため、特定のValidationGroup "vg2"を使用していることに注意してください。

また、日付を検証したい&time

さらに2つ必要です。 TextBoxChanged_DateTimeTestメソッド...

protected void TextBoxChanged_DateTimeTest(object sender, EventArgs e)
    {
        Page.Validate("vg2");
        if (!Page.IsValid)
        {
            TextBox tb1 = (TextBox)sender;
            IFormatProvider culture = new CultureInfo("en-AU", true);

            //if page is not valid, then validate the date here and default it to today's date & time, 
            String[] formats = { "dd MM yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd-MM-yyyy HH:mm" };
            DateTime dt1;
            DateTime.TryParseExact(tb1.Text, formats, culture, DateTimeStyles.AdjustToUniversal, out dt1);
            if (dt1.ToShortDateString() != "1/01/0001")
                tb1.Text = dt1.ToShortDateString() + " " + dt1.ToShortTimeString();
            else
                tb1.Text = DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
        }
    }

また、サーバー側でCustomValidatorを検証する必要もあります。私の場合、TextBoxは日付と時刻を受け入れる必要があります!

これがマークアップです...

<asp:CustomValidator ID="CustomValidator3" runat="server" ControlToValidate="txtLeft" ErrorMessage="Invalid date & time format (dd/MM/yyyy HH:mm)" 
                                    SetFocusOnError="true" ValidationGroup="vg2" OnServerValidate="CustomValidator_DateTime"></asp:CustomValidator>

そして、これが背後にあるコードです...

protected void TextBoxChanged_DateTimeTest(object sender, EventArgs e)
{
    Page.Validate("vg2");
    if (!Page.IsValid)
    {
        TextBox tb1 = (TextBox)sender;
        IFormatProvider culture = new CultureInfo("en-AU", true);

        //if page is not valid, then validate the date here and default it to today's date & time, 
        String[] formats = { "dd MM yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd-MM-yyyy HH:mm" };
        DateTime dt1;
        DateTime.TryParseExact(tb1.Text, formats, culture, DateTimeStyles.AdjustToUniversal, out dt1);
        if (dt1.ToShortDateString() != "1/01/0001")
            tb1.Text = dt1.ToShortDateString() + " " + dt1.ToShortTimeString();
        else
            tb1.Text = DateTime.Today.ToShortDateString() + " " + DateTime.Now.ToShortTimeString();
    }
}

幸運を!

3
Fandango68

問題は、ページのすべての実行を効果的に停止する Response.End() を呼び出していることです。したがって、if/elseブロックはまったく実行されていません。デバッグ中にその行をコメント化するかスキップして、期待どおりにバリデーターが起動します。

この方法で応答を書き出す代わりにデバッガを使用するか、それを使用する場合はResponse.End()の結果に注意することをお勧めします。

1
Ahmad Mageed

私の記憶では、テキストボックスが空の場合、カスタムバリデーターは起動しません。

1
Andrey

コードに複数のパートがあり、各パートにバリデーターがある場合、パートごとにvalidateGroupを作成します

0
Hossein Pour