[英]asp.net custom validator not firing for textbox
我有一個必需的字段驗證器和自定義驗證器來驗證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;
我也有這個問題。 是的,所有其他驗證器必須在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”,因為我還有其他我不想驗證的區域。
另外,我想驗證日期和時間 !
你還需要兩件事。 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.