asp.net自定义validation器没有为文本框触发

我有一个必需的字段validation器和自定义validation器来validationtexbox。 必需的字段validation器完全触发。 我无法正确启动自定义validation器?


代码背后

 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以便validation空文本。 然后,您将不再需要RequiredFieldValidator

编辑:我把你的代码复制并粘贴到一个空项目中,它按预期工作。 必须有一些你没有发布或发布错误的东西,我们不知道。 是否还有其他因素会影响触发validation的按钮或validation控件本身?

编辑:这是确切的代码(它在内容页面中):

aspx页面:

  

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

好的……真的很老的问题还没有接受的答案,我刚刚遇到了同样的问题。

所以我打算把这个问题扔给那些可能有这个问题需要答案的人……

如果您正在进行常规validation以及自定义服务器validation,那么自定义服务器validation将仅在所有其他validation都恢复清理时触发,至少,这对我来说是有效的。

请记住在CustomValidator上设置此属性…

 ValidateEmptyText="True" 

除了上面的建议,我发现在更新版本的.Net框架中,你必须在服务器上显式激活validate()方法以获得自定义validation器例程

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

我也有这个问题。 是的,所有其他validation器必须在CustomValidator触发之前传递。

但是,如果这对您不起作用,则可能需要使用Page.Validate()强制validation特定validation组

这就是我做的,我仍然设法保留我的RequiredFieldValidator ,不需要ValidateEmptyText="true"

在文本框中添加陷阱以强制进行validation。

  

请注意,我使用的是特定的ValidationGroup “vg2”,因为我还有其他我不想validation的区域。

另外,我想validation日期和时间

你还需要两件事。 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(); } } 

而且您还需要服务器端validationCustomValidator 。 在我的情况下,TextBox必须接受日期和时间!

所以这是标记……

  

这是背后的代码……

 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块根本没有运行。 注释在调试时排除或跳过它,validation器将按预期触发。

我建议您使用调试器而不是以这种方式写出响应,或者如果您选择使用它,请注意Response.End()的后果。

据我记得,如果您的文本框为空,自定义validation器将不会触发。