c# webform_postbackoptions asp.netカスタムバリデーターはテキストボックスのために発射しない




new webform_postbackoptions (6)

私はテクスチャボックスを検証するために必要なフィールドバリデーターとカスタムバリデーターの両方を持っています。 必要なフィールドバリデーターは完全に起動します。 カスタムバリデーターを正しく発射できないのですか?

<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;
    }

OK ...本当に古い質問です。答えはまだありません。私はちょうど同じ問題に遭遇しました。

だから、私はこの問題を抱え、答えが必要な他の誰かのためにこれを投げ捨てるつもりです...

カスタムサーバーの検証と一緒に定期的な検証を行っている場合、カスタムサーバーの検証は、それ以外のすべての検証が正常に行われた場合にのみ起動します。


私もこの問題を抱えていた。 はい、他のすべてのバリデータは、 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"を使用していますが、検証したくない他の領域があることに注意してください。

また、私は日付と時刻を検証したい!

もう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();
    }
}

がんばろう!


私が覚えている限り、あなたのテキストボックスが空の場合、カスタムバリデーターは起動しません。


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

ValidateEmptyText="True"

CustomValidatorプロパティValidateEmptyTexttrue設定されていることを確認し、空のテキストを検証します。 その後、 RequiredFieldValidatorRequiredFieldValidatorません。

編集:私はあなたのコードをコピーし、空のプロジェクトに貼り付け、期待どおりに動作します。 私たちが気づいていない、あなたが投稿していない、または間違って投稿しているものがなければなりません。 妥当性検査や妥当性検査のコントロールをトリガーしているボタンに影響するものは他にありますか?

編集:正確なコードはここにあります(コンテンツページにあります):

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;
} 

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

この方法で応答を書いたり、 Response.End()を使用することを選択した場合、その結果を認識するのではなく、デバッガを使用することをお勧めします。





customvalidator