【问题标题】:ASP.NET Web-forms custom validator not firingASP.NET Web 表单自定义验证器未触发
【发布时间】:2011-08-06 13:52:27
【问题描述】:

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

<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 - 如果您想要页面的完整源代码及其代码隐藏,请点击以下链接:

【问题讨论】:

  • 如果你添加一个断点它不会中断?
  • 不,如问题所述,服务器验证事件cvVendorBriefFile_ServerValidate 中的断点不会被命中。按钮单击事件 do 中的断点被命中。
  • 现在提供的两个答案都是错误的,我用你的代码做了一个实验室,它可以工作,你还有别的东西,也许在客户端。当我按下按钮时,代码会进入验证。试试看,将代码复制粘贴到新页面中。 (更新:答案没有错,只是没有解决你的问题)
  • 有趣。我将不得不进一步玩这个。我只是做了同样的事情,你是对的。在新页面中一切正常。我被难住了。
  • 我在问题末尾添加了一些指向完整源代码的链接。

标签: c# asp.net events validation webforms


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢杰米特。不知道为什么会这样,但确实如此。这绝对是问题所在。
    • 我认为这是一个糟糕的设计决定,过去曾让我头疼不已。实际含义是,当您对不允许为空的控件进行任何验证时,您必须执行此操作(并且始终验证)或首先添加RequiredFieldValidator,这只是让工作。
    • 我同意。验证控件至少应该具有某种属性,例如 ValidateIfEmpty 或其他东西,因为这很愚蠢。
    • 面部护理! IS 有一个属性来验证空值。 msdn.microsoft.com/en-us/library/…(我测试过它有效)。哦!
    • 我隐约意识到这一点。出于某种原因,我认为它是新的,但文档说它是在 2.0 中添加的,所以是的,它也可以!
    【解决方案3】:

    如果您查看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 财产。 (您也可以调用 验证器控件显式使用 Validate 方法。)在你自己的 代码,你应该检查 Page.IsValid 属性返回 true 在处理输入之前。虽然 启用脚本的浏览器可能会阻止 从发生的回发 客户端,如果验证检查有 失败,你也应该经常检查 之前的服务器代码中的 Page.IsValid 处理经过验证的数据。

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

    【讨论】:

    • 我在一分钟前粘贴了按钮单击事件,我将整个事件包裹在 if (Page.IsValid) 块中。我删除了该代码,而是粘贴了指向完整代码页的链接。如果您点击CS 链接,您将看到按钮单击事件包含在 IF 语句中。
    • 在断开连接的网络世界中,您的编辑(对我而言)在我发布的同时出现。抱歉,我的帖子对您​​没有帮助。
    • 不用担心。只是让你知道。
    • 好的,请尝试一下。不要在点击事件中测试“IsValid”,而是在 if(!IsPostBack) 下的 else 中的 Page_Load 中尝试它。
    • 好的,会的。给我一点时间。
    【解决方案4】:

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

    【讨论】:

    • 试过了。没有效果。默认情况下它应该是真的。
    • 我也是。它适用于新页面。但这里一定有些奇怪。我发布了完整的源代码。
    【解决方案5】:

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

    【讨论】:

    • 如果您查看验证器和按钮控件,您会发现它们具有相同的验证组。
    • 啊,轮到我不仔细看了。除了 Causevalidation="true" 之外,我想不出太多其他的了。您的控件是动态添加到页面中的,还是在 .ascx / .aspx 源中静态声明的?
    • 它们是静态声明的。也许我会将完整的源代码粘贴到一个粘贴箱中,任何有兴趣的人都可以查看它并找出任何奇怪之处。
    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 2010-10-16
    相关资源
    最近更新 更多