我的页面上有一个自定义验证器,用于文件上传控制。
<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 - 如果您想要完整的网页源及其代码隐藏,请点击以下链接:
如果你看到任何奇怪的东西,请告诉我。我在这里半睡半醒,我希望我只是缺少一些愚蠢的东西。
答案 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)
你看
使用验证器控件时,您 应该经常检查结果 之前的服务器端验证 执行任何处理。之后 回发但在你的事件方法之前 被调用,页面调用 验证器控件和聚合 他们的结果进入了Page.IsValid 属性。 (你也可以打电话给 验证器控件显式使用 验证方法。)在你自己的 代码,你应该检查一下 Page.IsValid属性返回true 在处理输入之前。即使 支持脚本的浏览器可能会阻止 回发发生在 客户端,如果验证检查有 失败了,你应该经常检查 之前的服务器代码中的Page.IsValid 处理经过验证的数据。
那么,您正在测试页面加载中的Page.IsValid
吗?