ASP.NET Web-forms自定义验证器未触发

本文关键字:验证 NET Web-forms 自定义 ASP | 更新日期: 2023-09-27 17:50:30

我的页面上有一个自定义验证器用于文件上传控制。

<asp:FileUpload ID="fuVendorBrief" runat="server" />
<br />
<asp:CustomValidator ID="cvVendorBriefFile" Display="Dynamic" runat="server" ValidationGroup="EditorValidate" ControlToValidate="fuVendorBrief" OnServerValidate="cvVendorBriefFile_ServerValidate" ErrorMessage="You must upload a vendor brief PDF file.">     
</asp:CustomValidator>

我也有一个按钮。

<asp:Button ID="btnSubmit" ValidationGroup="EditorValidate" OnClick="btnSubmit_Click" runat="server" Text="Add Vendor Brief" />

我已经定义了我的自定义验证器事件如下…

protected void cvVendorBriefFile_ServerValidate(object source, ServerValidateEventArgs args)
{
    CustomValidator fileUploadValidator = (CustomValidator)source;
    FileUpload vendorBriefFileUpload = (FileUpload)fileUploadValidator.Parent.FindControl(fileUploadValidator.ControlToValidate);
    args.IsValid = vendorBriefFileUpload.HasFile && vendorBriefFileUpload.FileName.ToLower().EndsWith(".pdf");
}

这个自定义验证器甚至没有被触发。在我看来一切都很好。如果我在服务器验证事件的任何地方放置一个断点,当我单击提交时它不会被击中。但是,我可以在提交按钮的单击事件中击中断点。

任何想法?

EDIT -我在页面上有其他验证控件,如必填字段验证器,它们很好地启动。

EDIT 2 -如果您想要页面的完整源代码及其代码,请点击以下链接:

  • ASPX
  • c

ASP.NET Web-forms自定义验证器未触发

尝试完全删除ControlToValidate。虽然我以前从未尝试过验证文件上传,但如果内容为空,大多数验证器都不会触发(RequiredField除外)。取消控件以验证应该使它始终为该组启动。

EDIT (Chevex) - ControlToValidate是问题,但不是因为它坏了。默认情况下,它不会在没有值的控件上触发,如上所述。设置自定义验证器控件属性ValidateEmptyText="true"解决了这个问题。很遗憾,我不得不开始这个巨大的问题,只是为了找到它,但现在我们知道了!:)

您需要为您的按钮和验证器指定相同的ValidationGroup="

对于我来说,当验证器及其相关输入位于控件中,并且在控件标记中设置了visible="false"时,就会发生这种情况。这将导致CustomValidator继承Visible = false属性并阻止验证触发。在正常的页面加载中,直到页面生命周期的后期,我才使控件可见。

在任何情况下,如果您在Page.Validate()方法上设置了一个断点,您可以检查Page.Validators集合,看看是否会发生类似的事情。

CausesValidation="True"添加到您的Button声明中

如果您查看http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(%22ASP%3aCUSTOMVALIDATOR%22);k(VS.HTMLDESIGNER.HTML);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV3.5%22);k(DevLang-ASPX)&rd=true

的文档

你看

当使用验证器控件时,您可以应该经常检查结果吗之前的服务器端验证执行任何处理。后回发但在事件方法之前被调用,页面调用验证器控件和聚合他们的结果进入页面。IsValid财产。(你也可以打电话给Validator控件显式地使用Validate方法。)以你自己的方式代码,你应该检查页面。IsValid属性返回true在处理输入之前。尽管启用脚本的浏览器可能会阻止上发生的回发客户端是否有验证检查失败了,你也要经常检查页面。以前在服务器代码中有效处理经过验证的数据

所以,在测试Page.IsValid在你的页面加载?