我有一个必需的字段验证器和自定义验证器来验证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;
}
答案 0 :(得分:49)
检查您的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;
}
答案 1 :(得分:18)
好的......真的很老问题还没有接受答案,我刚刚遇到了同样的问题。
所以我打算把这个问题扔给那些可能遇到这个问题需要答案的人......
如果您正在进行常规验证以及自定义服务器验证,则只有在所有其他验证都恢复干净的情况下才会触发自定义服务器验证,至少这是对我有用的方式。
答案 2 :(得分:9)
请记住在CustomValidator上设置此属性...
ValidateEmptyText="True"
答案 3 :(得分:4)
除了上面的建议之外,我发现在更新版本的.Net框架中,您必须在服务器上显式触发validate()方法以获取自定义验证程序
// validate page before allowing import to go through
Page.Validate();
if (!Page.IsValid)
return;
答案 4 :(得分:3)
我也有这个问题。是的,所有其他验证者必须通过 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
&#34; vg2&#34;,因为我还有其他一些我不想验证的方面。
另外,我想验证日期&amp;时间强>!
你还需要两件事。 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必须接受日期&amp;时间!
所以这里是标记...
<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();
}
}
祝你好运!
答案 5 :(得分:1)
问题是你正在调用Response.End()
,这有效地阻止了页面的所有执行。因此,if / else块根本没有运行。注释在调试时排除或跳过它,验证器将按预期触发。
我建议您使用调试器而不是以这种方式写出响应,或者如果您选择使用它,请注意Response.End()
的后果。
答案 6 :(得分:1)
据我记得,如果您的文本框为空,则自定义验证程序不会触发。
答案 7 :(得分:0)
如果代码中包含多个部分,并且每个部分都有一些验证器,请为每个部分创建validateGroup