ASP.NET Web表单自定义验证程序未触发

时间:2011-04-15 19:08:24

标签: c# asp.net events validation webforms

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

<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");
}

这个自定义验证器甚至没有被解雇。也许我只是累了,但是一切看起来都不错,所以我很感激。如果我在服务器验证事件中的任何地方删除断点,那么当我单击提交时它不会被点击。我可以在提交按钮的点击事件中点击断点。

有什么想法吗?

编辑 - 忘记提及我在页面上有其他验证控件,例如必填字段验证器,它们可以正常启动。

编辑2 - 如果您想要完整的网页源及其代码隐藏,请点击以下链接:

如果你看到任何奇怪的东西,请告诉我。我在这里半睡半醒,我希望我只是缺少一些愚蠢的东西。

5 个答案:

答案 0 :(得分:19)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果您查看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

上的文档

你看

  

使用验证器控件时,您   应该经常检查结果   之前的服务器端验证   执行任何处理。之后   回发但在你的事件方法之前   被调用,页面调用   验证器控件和聚合   他们的结果进入了Page.IsValid   属性。 (你也可以打电话给   验证器控件显式使用   验证方法。)在你自己的   代码,你应该检查一下   Page.IsValid属性返回true   在处理输入之前。即使   支持脚本的浏览器可能会阻止   回发发生在   客户端,如果验证检查有   失败了,你应该经常检查   之前的服务器代码中的Page.IsValid   处理经过验证的数据。

那么,您正在测试页面加载中的Page.IsValid吗?