尝试添加jQuery验证所需的其他内容

时间:2012-10-22 18:26:51

标签: asp.net-mvc-4 jquery-validate

我已经阅读了我能找到的所有其他jQuery验证问题,没有任何帮助我。我正在尝试做一些应该如此简单但不显眼的验证让我想在我的所有四个显示器上打个洞(嫉妒?)

我有一个select形式的字段,另一个作为日期选择器。当选择采用某个值时,日期变为必需。对于所有其他选择值,日期是可选的。首次加载页面时,日期是可选的 - 也就是说,模型元数据中没有Required属性。

这是我的脚本块以及我需要帮助的漏洞:

<script type="text/javascript">
    function DateRequirement() {
        if ($("#StatusID").val() == 602) {
            $("#DateOfFirstCoverage").attr("data-val-required", "A date is required for current members.");
            // some kind of re-validating here?
        }
        else if ($("#DateOfFirstCoverage").attr("data-val-required") !== undefined) {
            $("#DateOfFirstCoverage").rules("remove", "required");
            // some kind of re-validating here?
        }
    }

    $("#StatusID").change(DateRequirement);
    $(document).ready(DateRequirement);
</script>

仅供参考我已尝试过添加要求的其他方式,例如使用.rules("add", { required: true })但仍有问题。这是我的问题清单:

  1. 使用.rules添加所需的方法,我得到设置错误未定义。大量的SO答案说你需要首先重新验证表单,我试过,除了尽管它摆脱了错误,该字段仍然不是必需的。
  2. 我现在拥有代码的方式(如上所示)成功地使该字段成为必需字段,但仅在文档准备就绪时设置。如果我在加载后更改选择框,则永远不会需要它。
  3. 最奇怪的问题,无论我尝试什么,任何能给出任何成功迹象的东西都会破坏页面上的其余验证。我有一堆其他必填字段。如果我的DateOfFirstCoverage字段成功地被要求,并且我填写它但删除了不同的必填字段,则页面愉快地提交而无需验证抱怨其他字段。例如,如果我的代码段的一部分如下所示,则会发生这种情况:

    if ($("#StatusID").val() == 602) {
        $("form").validate();
        $("#DateOfFirstCoverage").rules("add", { required: true });
    }
    
  4. 那么,到底是怎么回事?在不弄乱其余规则的情况下,完成我想要的“正确”方法是什么?

1 个答案:

答案 0 :(得分:4)

想出这个。其他一篇文章中提供了正确的答案 - this one - 但我必须弄清楚如何使用它。最后的脚本块是这样的:

<script type="text/javascript">
    function DateRequirement() {
        $("form").removeData("validator").removeData("unobtrusiveValidation");
        $.validator.unobtrusive.parse("form");

        if ($("#StatusID").val() == 602) {
            $("#DateOfFirstCoverage").rules("add", { required: true, messages: { required: "A date is required for current members." } });
        }
        else {
            $("#DateOfFirstCoverage").rules("remove", "required");
            $("form").validate().element("#DateOfFirstCoverage");
            console.log("reset");
        }
    }

    $("#StatusID").change(DateRequirement);
    $(document).ready(DateRequirement);
</script>

删除顶部的验证器可确保不引人注目的验证不会提前挽救,因为已经连接了验证器。这解决了我为什么其他领域没有验证的奇怪问题。然后通过询问unobtrusive进行解析,总会有一个验证器,所以我可以使用常规规则add方法来处理所需的规则。