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;
}
空のテキストが検証されるように、CustomValidator
プロパティValidateEmptyText
がtrue
に設定されていることを確認してください。そうすれば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;
}
わかりました...まだ受け入れられていない本当に古い質問で、私は同じ問題に遭遇しました。
だから私はこの問題を抱えている可能性があり、答えが必要な他の人のためにそこに捨てます...
カスタムサーバー検証とともに定期的な検証を行っている場合、カスタムサーバー検証は、他のすべての検証が正常に戻った場合にのみ起動します。
CustomValidatorでこのプロパティを設定することを忘れないでください...
ValidateEmptyText="True"
上記の提案に加えて、新しいバージョンの.Netフレームワークでは、サーバーでvalidate()メソッドを明示的に起動してカスタムバリデータールーチンを取得する必要があることがわかりました
// validate page before allowing import to go through
Page.Validate();
if (!Page.IsValid)
return;
私もこの問題を抱えていました。はい、他のすべてのバリデーターは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();
}
}
幸運を!
問題は、ページのすべての実行を効果的に停止する Response.End()
を呼び出していることです。したがって、if/elseブロックはまったく実行されていません。デバッグ中にその行をコメント化するかスキップして、期待どおりにバリデーターが起動します。
この方法で応答を書き出す代わりにデバッガを使用するか、それを使用する場合はResponse.End()
の結果に注意することをお勧めします。
私の記憶では、テキストボックスが空の場合、カスタムバリデーターは起動しません。
コードに複数のパートがあり、各パートにバリデーターがある場合、パートごとにvalidateGroupを作成します