【问题标题】:ASP MVC jQuery validation onfocusout working, but not on form submitASP MVC jQuery 验证 onfocusout 工作,但不是表单提交
【发布时间】:2014-11-06 11:03:12
【问题描述】:

我的 ASP MVC 项目和 jQuery 客户端验证存在问题。 问题是当按下提交按钮时,表单被验证但错误没有显示并且表单被提交。 只有当我在验证方法中调用 valid() 时才会出现问题。 例如:我有一个 isdatebefore 和 isdateafter 验证方法。 我想检查#start 是否在#end 之前。 因此,在验证 #start 时,它还会在 #end 上调用 validate 以确保错误消息在两个元素上出现/消失。 我添加了 onfocusout 验证,这工作得很好(在 #start 和 #ejnd 字段以及表单中的所有其他字段上)。 但是,当我按下提交按钮时,表单被验证(我放置了一些断点以查看是否调用了该方法),但尽管存在错误,但仍被提交。

这是我的代码:

// Add IsDateAfter validation
$.validator.addMethod("isdateafter", function (value, element, params) {
    var self = $(element);
    var parts = element.name.split(".");
    var prefix = "";
    for (var i = 0; i < parts.length - 1; i++)
        prefix = parts[i] + ".";
    var otherElement = $('input[name="' + prefix + params.propertytested + '"]');
    var startdatevalue = otherElement.val();
    if (!value || !startdatevalue)
        return true;
    var allowequal = params.allowequaldates.toLowerCase() === "true";
    var start = Globalize.parseDate(startdatevalue);
    var end = Globalize.parseDate(value);
    if (!self.data('reval')) {
        self.data('reval', true);
        otherElement.data('reval', true);
        otherElement.valid();
        self.data('reval', false);
        otherElement.data('reval', false);
    }
    var isValid = allowequal ? start <= end :
        start < end;
    if (isValid) {
        self.removeClass('input-validation-error');
    }
    return isValid;
});

$.validator.unobtrusive.adapters.add(
    'isdateafter', ['propertytested', 'allowequaldates'], function (options) {
        options.rules['isdateafter'] = options.params;
        options.messages['isdateafter'] = options.message;
    });

// Add IsDateBefore validation
$.validator.addMethod("isdatebefore", function (value, element, params) {
    var self = $(element);
    var parts = element.name.split(".");
    var prefix = "";
    for (var i = 0; i < parts.length - 1; i++)
        prefix = parts[i] + ".";
    var otherElement = $('input[name="' + prefix + params.propertytested + '"]');
    var startdatevalue = otherElement.val();
    if (!value || !startdatevalue)
        return true;
    var allowequal = params.allowequaldates.toLowerCase() === "true";
    var start = Globalize.parseDate(startdatevalue);
    var end = Globalize.parseDate(value);
    if (!self.data('reval')) {
        self.data('reval', true);
        otherElement.data('reval', true);
        otherElement.valid();
        self.data('reval', false);
        otherElement.data('reval', false);
    }
    var isValid = allowequal ? start >= end :
        start > end;
    if (isValid) {
        $(element).removeClass('input-validation-error');
    }
    return isValid;
});

$.validator.unobtrusive.adapters.add(
    'isdatebefore', ['propertytested', 'allowequaldates'], function (options) {
        options.rules['isdatebefore'] = options.params;
        options.messages['isdatebefore'] = options.message;
    });

代码在 onfocusout 事件中运行良好,但在 onsubmit 事件中调用时出现问题。 当我删除对 otherElement.valid(); 的调用时一切都恢复正常了(但我需要验证另一个元素才能正常工作)。

那么有谁知道我如何在验证一个元素时继续验证这两个元素并且仍然不会在提交时搞砸?

【问题讨论】:

  • 如何提交表单?
  • 使用一个简单的按钮:
  • 你试过&lt;button type="submit" onclick="return validateForm()"&gt;Save&lt;/button&gt;吗?在validateForm() 函数中,您可以检查表单的有效性
  • 正如我所说,提交表单时会调用 jquery 验证,它只是不会停止提交表单并显示错误。

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


【解决方案1】:

您不能在另一个 jQuery Validate 方法中使用 .valid() 方法。

Use .element() instead...

$('#yourForm').validate().element(otherElement);

或使用关键字this,它代表插件自身方法中的validator对象...

this.element(otherElement);

或者您已经验证为有效(如果 this 关键字有效,则有些重复)...

otherElement.parents('form').validate().element(otherElement);

【讨论】:

  • 感谢您为我指明正确的方向!但是你必须调用 otherElement.parents('form').validate().element(otherElement);因为元素方法是附加到表单的验证器的成员。如果你编辑你的答案,我会很乐意接受它:)
  • @wertzui,是的,你是对的,当然。我刚刚对其进行了测试,this 关键字也代表了方法中的validator 对象。
  • 再次遇到麻烦后,我发现使用this.element(otherElement); 调用this.prepareElement( element ); 调用this.reset();。因此,当之前已验证的字段(即在其之前的 HTML 标记中)被标记为无效时,这将破坏提交验证,因为this.reset(); 将清除this.errorList。所以不要使用this.element(otherElement);,你必须使用this.check(otherElement);
猜你喜欢
  • 1970-01-01
  • 2013-03-29
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 2013-05-06
  • 2016-11-13
相关资源
最近更新 更多