用于客户端验证的customvalidator无法正常工作

时间:2014-01-28 20:11:51

标签: asp.net webforms custom-validators

我们有许多客户使用的表格,有人可以在他们的网站上注册。它是可自定义的,因为表单的所有者可以设置要在表单上显示或隐藏的字段,也是必需的。但是,如果显示某些字段,则需要为表单设置另一个字段才能生效。因此验证可能很棘手。另一个棘手的部分是我们希望在验证摘要中一起显示所有错误消息。如果我只是将自己的函数调用onclientclick作为linkbutton,我就无法将它生成的任何错误消息添加到验证摘要中。

因此我们最初找到的解决方案是在页面上创建自定义验证器而不设置它的controltovalidate属性,但将其clientvalidationfunction设置为我们想要调用的函数。这允许我们设置sender参数的errormessage,以便它随后出现在validationsummary中。

我们需要添加一些额外的验证逻辑,当我这样做时,我意识到页面不再像过去那样工作(我认为它在.net 2中工作,现在我们在.net 4上)。

这是我的基本HTML代码。

网页 -

<asp:ValidationSummary ID="vsummary" runat="server" HeaderText="Oops, it appears the following required fields are not completed." CssClass="error" />
<asp:CustomValidator ID="cstCustomScripts" runat="server" ClientValidationFunction="ValidateExtraFields" />
...additional form fields here
<asp:LinkButton ID="btnAddUpdate" runat="server" onclick="SubmitProfile" />

自定义验证器调用的javascript ...

function ValidateExtraFields(sender, args) {
    args.IsValid = true;

    if (typeof window.RelocationSelectionRequired == 'function') {
        if (!RelocationSelectionRequired()){
            args.IsValid = false;
            sender.errormessage = "If you are open to relocating, please select the state(s) and cities.";
            return;
        }
    }

    if (typeof window.ValidateHomeState == 'function') {
        if (!ValidateHomeState()) {
            args.IsValid = false;
            sender.errormessage = "Home state is required.";
            return;
        }
    }

    if (typeof window.ValidateWorkState == 'function') {
        if (!ValidateWorkState()) {
            args.IsValid = false;
            sender.errormessage = "Work state is required.";
            return;
        }
    }

    var invalidNumberField = "";
    $("[data-validate-function='GreaterThanZero']").each(function () {
        var t = $(this);
        if (t.val().trim() == "0") {
            args.IsValid = false;
            invalidNumberField = t.attr("controlName");
            return false;
        }
    });

    if (invalidNumberField.length > 0) {
        sender.errormessage = invalidNumberField + " cannot be zero.";
        return;
    }
}

过去,该函数会成功将来自此函数的任何消息附加到validationsummary控件,而不是提交表单。现在它仍然附加消息,但表单也应该在不应该提交时提交。有谁知道这是从.net 2转移到.net 4的结果吗?还是有其他原因它不再起作用?感谢。

2 个答案:

答案 0 :(得分:0)

您的链接按钮应该CauseValidation = true,以便触发验证。

答案 1 :(得分:0)

你说你相信这是在.net 2.0中工作的。我找到了一个关于Breaking changes in ASP.NET 4的网页。我没有看到任何关于CustomValidator Control的具体信息。但它说的是web.config中的一个设置,您可以尝试使用。它会将渲染兼容性版本降低到2.0或3.5。

<pages controlRenderingCompatibilityVersion="2.0" />

<pages controlRenderingCompatibilityVersion="3.5" />

如果不起作用,您还可以尝试将Web项目的.net版本降低到2.0或3.5。