【问题标题】:Javascript - jQuery Validate plugin rules method not workingJavascript - jQuery Validate 插件规则方法不起作用
【发布时间】:2018-04-16 13:47:45
【问题描述】:

我有一个简单的 javascript 文件,只需要运行 rules 方法。不幸的是,由于某种原因它不起作用。我知道我的自定义 javascript 文件渲染得很好,因为输入掩码工作正常。我已经仔细检查以确保我已经渲染了 jquery 验证脚本,所以我不确定我的问题是什么。该项目是一个在 Visual Studio Enterprise 2015 平台上编写的简单 mvc 网站。网站上有问题的页面是EditInfo页面,供您参考。

这是添加验证包的 BundleConfig.cs。

public static void RegisterBundles(BundleCollection bundles)
    {
     //More bundles obviously are added
      bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                    "~/Scripts/jquery.validate*"));
    }

接下来,这里是 Layout 文件,脚本在其中呈现。

@Scripts.Render("~/bundles/jqueryval")

接下来,这里是视图中声明的 2 个自定义 javascript 文件。

    <script src="@Url.Content("~/Scripts/EditInfo.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/app.js")" type="text/javascript"></script>

然后,这里是使用 validate 方法的 EditInfo 自定义 javascript 文件。这是整个文件,减去关于输入屏蔽的 3 行工作正常。

$(document).ready(function () {
var counter = 0;
var $CreateProfilevalidator = {};


$CreateProfilevalidator = $("#frmEditInfo").validate({
    rules: {
        personalEmail:/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,15}|[0-9]{1,3})(\]?)$/i,
        otherEmail: /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,15}|[0-9]{1,3})(\]?)$/i,
        workCell: /^\(?\d{3}\)?\s?-?\d{3}\s?-?\d{4}$/,
        personalCell: /^\(?\d{3}\)?\s?-?\d{3}\s?-?\d{4}$/,
        otherPhone: /^\(?\d{3}\)?\s?-?\d{3}\s?-?\d{4}$/
    },
    messages: {
        personalEmail: "Invalid Email",
        otherEmail: "Invalid Email",
        workCell: "Invalid Phone Number",
        personalCell: "Invalid Phone Number",
        otherPhone: "Invalid Phone Number"
    },
    errorPlacement: function (error, element) {
        errorPlacementValidator(error, element);
    },
    highlight: function (element, errorClass, validClass) {
        counter++;
        highlightValidator(element, errorClass, validClass, counter);
    },
    unhighlight: function (element, errorClass, validClass) {
        counter++;
        unhighlightValidator(element, errorClass, validClass, counter);
    }

});
});

最后,这里是 app.js 文件,其中包含我的 javascript 文件中使用的 3 个验证器方法。

function errorPlacementValidator(error, element) {
if (element.is(":radio")) {
    error.appendTo(element.closest("[class*='col-sm-']"));
}
else if (element.parents('.selectric-wrapper').size() > 0) {
    console.log('selectric error');
    error.appendTo(element.closest('[class*="col-sm-"]'));
}
else {
    error.appendTo(element.parent());
}
}

function highlightValidator(element, errorClass, validClass, counter) {
var $parent = $(element).parent();

// remove icon and success spans if any
$parent.find("span.form-control-feedback, span.sr-only").remove();

// add ".error" class to input element
$(element).addClass(errorClass).removeClass(validClass);

// add Bootstrap ".has-error" class to parent div.form-group element
$(element).closest(".form-group").removeClass("has-success").addClass("has-error has-feedback");

// need to have it check to see if span already added
// only add for non radio or non select input elements
if (!$(element).is(":radio, select, textarea, :checkbox, .btn") && !$(element).hasClass("datepicker")) {
    counter++;

    var $spans = $parent.find("span");

    // check to make sure error spans are not already in form-group before attempting to append after input
    if ($spans.length == 0) {
        // add span element with ".glyphicon" ".glyphicon-remove" ".form-control-feedback" classes after input
        $(element).after("<span class='glyphicon glyphicon-remove form-control-feedback' aria-hidden='true'></span>");
        $(element).after("<span id='inputError" + counter + "Status'" + " class='sr-only'>(error)</span>");
    }
}
}

function unhighlightValidator(element, errorClass, validClass, counter) {
var $parent = $(element).parent();

// remove icon and success spans if any
$parent.find("span.form-control-feedback, span.sr-only").remove();

// remove ".error" class from input element
$(element).removeClass(errorClass).addClass(validClass);

if (!$(element).is(":radio, select, textarea, :checkbox, .btn") && !$(element).hasClass("datepicker")) {
    // // remove Bootstrap ".has-error" class from parent div.form-group element
    $(element).closest(".form-group").removeClass("has-error").addClass("has-success has-feedback");

    var $spans = $parent.find("span");

    if ($spans.length == 0 && !$(element).is("select")) {
        $(element).after("<span class='glyphicon glyphicon-ok form-control-feedback' aria-hidden='true'></span>");
        $(element).after("<span id='inputSuccess" + counter + "Status'" + " class='sr-only'>(error)</span>");
    }
} else if ($(element).parents('.selectric-wrapper').size() > 0) {
    $(element).closest(".form-group").removeClass("has-error").addClass("has-success has-feedback");
}
}

我已经用谷歌搜索并完成了我的研究,但原因仍然无法掌握。如果我遗漏了任何重要信息,我深表歉意。但是,当我输入格式不正确的电子邮件地址或比要求的电话号码短时,我正在编写的网站仍然不会出错。 编辑:措辞

【问题讨论】:

  • 您是否尝试过阅读文档或查看 SO 上的其他示例?我可以告诉你,我从未见过这样的尝试。
  • @Sparky “这样的尝试”是什么意思?我的尝试有什么异常? (没有sass的意思)我以为我在遵循通常的程序。
  • 你完全错过了规则本身。请参阅下面的答案。

标签: javascript jquery asp.net jquery-validate


【解决方案1】:

rules 对象是使用逗号分隔的key: value 对列表构造的,这些对表示字段名称及其方法。在方法部分内部是另一个以逗号分隔的 key: value 对列表,它们表示方法名称及其参数。您的尝试完全缺少实际规则(方法)。

$('#yourform').validate({
    rules: {  
        fieldname1: {        // <- field NAME
            required: true,  // <- rule (method) : parameter
            phoneUS: true    // <- rule (method) : parameter
        },
        fieldname2: {        // <- field NAME
            required: true,  // <- rule (method) : parameter
            email: true      // <- rule (method) : parameter
            .....

如果要验证正则表达式,则需要使用 pattern 方法,它是 the additional-methods.js file 的一部分。

$CreateProfilevalidator = $("#frmEditInfo").validate({
    rules: {
        personalEmail: {
            pattern: /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,15}|[0-9]{1,3})(\]?)$/i
        },
        otherEmail: {
            pattern: /^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,15}|[0-9]{1,3})(\]?)$/i
        } 
        ....

由于缺少您的规则列表,我也不知道您是否想要字段 required 等。但您还需要列出这些规则。

虽然我们在这里,为什么所有的正则表达式?该插件已经包含了电话号码和电子邮件地址的各种方法。请参阅文档并浏览 Additional-Methods 文件。

【讨论】:

  • 我没有意识到使用正则表达式,需要模式方法,谢谢。每条规则的不{}是我往墙上扔东西并希望有东西卡住。我之前有正确的方法。验证包中是否会自动呈现附加方法.js 文件?还是我需要自己声明那个特定的脚本文件?最后一个问题,我需要'required:true'吗?我不需要它们,它是一个内部站点(在美国),正则表达式和输入掩码应使电话号码保持适当的长度。
  • 此答案并非特定于 ASP,这也是您在问题中从未提及的内容。但是,我想您需要单独包含 additional-methods.js。否则,从该文件中复制方法并将其粘贴到您自己的 JavaScript 中。
  • required 规则与长度无关。它只是使该字段必须填写。如果它不是强制性的,那么你就不需要它。但是,IMO,只需使用插件中内置的电话和电子邮件规则。
  • 谢谢。我很抱歉,我忘了在标题中包含 ASP.Net。是的,我正在使用 ASP.Net。
  • 我的措辞不好,我的意思是我不需要长度规则,但没有澄清。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-17
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多