【问题标题】:How can I add a method for custom validation?如何添加自定义验证方法?
【发布时间】:2012-10-19 14:03:04
【问题描述】:

我正在开发一个 ASP MVC3 项目,使用验证和不显眼的 jquery。我在页面上有几个区域需要为其创建自定义验证,并确保它不会破坏其他任何内容。目前我有几个部分,每个部分都有一个单选按钮对、一些文本框、一个按钮和一个表格。用户填写文本框,点击按钮,我有一个函数可以将文本框中的数据放入表格的新行中。我还有一个计数器,每次按下按钮都会前进一次。

验证需要遵循“如果单选按钮返回 true,则计数器需要 > 1。

我编写的这个函数似乎可以工作,但我认为我需要重新编写它,以便将其绑定到现有的验证中,因此需要添加一个方法或规则:

$(document).ready(function () {
    $("#nextBtn").click(function () {
         var rows = $("#ROTable tr").length;
          if ($("#RO_Yes").is("checked") && (rows < 3))
          {
             $(this).closest("div.historyCollection").css("backgroundcolor: #ff0000;");
          }
    });
});

我环顾四周,发现 JQUery 网站上有一个部分讨论了规则(从属值),似乎它可能适合。但是因为我对这些东西还很陌生,所以我想在我朝一个方向看太难之前对专家进行调查。感谢您的阅读。

编辑:我一直在玩,我想出了这个:

第二次编辑:正如 TallMaris 所指出的,ROCounter 选择器是错误的,因此现在已更正但仍然失败并出现相同的错误:

$(document).ready(function () {
    $("#ROCounter").rules("add", {
        required: ($("#RO-Yes").is(":checked")) && ($('#ROCounter') < 1),
        messages: {
            required: "Please enter further information"
        }
    });
});

但它破坏了所有验证并导致 jquery.validate.min.js 文件出错: " TypeError: 无法读取未定义的属性 'form'"。

ROCounter 是一个隐藏字段。如果错误消息附加到此隐藏字段,是否意味着该消息也将被隐藏,所以不显示?这是一些 HTML:

<div class="formQuestion">
        <div class="editor-field2">
            @Html.RadioButtonFor(m => m.HistoryModel.EverHadRestrainingOrder, true, new { @class = "commentBox", id="RO_Yes" })
                <label for="HistoryModel_ChildAbuseCurrent">Yes</label>
            @Html.RadioButtonFor(m => m.HistoryModel.EverHadRestrainingOrder, false, new { @class = "commentBox", id = "RO_No", @checked = "checked" })
                <label for="HistoryModel_ChildAbuseCurrent">No</label>
        </div>
        <div class="editor-label2">
            @Html.LabelFor(m => m.HistoryModel.EverHadRestrainingOrder)
        </div>

@*  Start Fieldset collection for Restraining Order   *@
   <div class="hidden">
     <fieldset class="historyCollection"> 
       <legend>Please provide the following information</legend>  
        <div class="formGroupHist">
            <div class="editor-label-Hist">
                @Html.Label("Date of Order")
            </div>
            <div class="editor-field-Hist">
                @Html.TextBox("OrderDate-RO", null, new { @class = "dp" })
            </div>
        </div>

        <div class="formGroupHist" style="width: 125px">
            <div class="editor-label-Hist">
                @Html.Label("State")
            </div>
            <div class="editor-field-Hist">
            @Html.DropDownList("State-RO", new SelectList(Model.State, "Value", "Text"), "Select", new { style = "width: 65px;" })
            </div>
        </div>

        <div class="formGroupHist">
            <div class="editor-label-Hist">
                @Html.Label("Name of Protected Party")
            </div>
            <div class="editor-field-Hist">
                @Html.TextBox("ProtectedParties")
            </div>
        </div>            

        <div class="formGroupHist">
            <div class="editor-label-Hist">
                @Html.Label("Explanation of Circumstances")
            </div>
            <div class="editor-field-Hist">
                @Html.TextArea("Comments-RO")
            </div>
        </div>
        <div class="button">
            <button type="button" id="ROButton" class="SKButton">Add Information</button>
        </div>

        <div>
            @Html.HiddenFor(m => m.ROCounter)
        </div>
        <table id="ROTable" class="data-table-page2">
            <tr>
                <th>Date of Order</th>
                <th>State</th>
                <th>Name(s) of Protected Parties</th>
                <th>Explanation of Circumstances</th>
            </tr>
            <tr class="ROTempRow">
                <td colspan=4>No Information Entered.</td>

            </tr>
        </table>
    </fieldset>
</div>

不过,我的主要问题是如何正确地将新的验证规则与现有的验证联系起来。我已经读过,不显眼的首先解析文档以寻找现有的验证,如果找到任何验证,它将不再进行。大部分表单都与“库存”验证相关联,因此我不能将其损坏。一旦我弄清楚了那部分,我可能会弄清楚它的实际规则编码。

谢谢。

【问题讨论】:

  • 可能只是因为选择器错误...试试$('#ROCounter')。这个 ROCounter 到底是什么类型的?你能展示一些 HTML 吗?
  • 这里胡乱猜测一下,模型上的 ROCounter 属性的注解是什么?请记住,即使您什么都不放,仅仅通过(例如)一个 int,将在不显眼的验证中生成至少一个“必需”规则,然后您将在 javascript 中重新添加...
  • @TallMaris - 啊,很好。尽管模型中没有装饰该属性,但我检查了呈现的 HTML,并且如您所说,对其进行了验证。我已经将该值设置为 0,这就是为什么它从未作为验证错误出现的原因。因此,如果已经附加了 data-val 属性,我可以根据需要使用/添加更多属性来实现我的验证。所以现在我只需要知道我是否应该添加一个不显眼的方法,或者一个验证插件规则。你的想法?
  • 这真的取决于所需的逻辑。 “必需”规则意味着该值不能为空,如果您需要更复杂的规则,您可以创建它($.validator.addMethod...)并将其添加到您的字段中。如果“必需”规则是您需要的,但您希望它使其“自定义”(实际上,仅在某些情况下计算并且意味着您可以接受空值),请将 C# 属性从 int 更改为 @987654327 @ 并且 MVC 不会为您创建所需的规则。

标签: jquery validation jquery-validate


【解决方案1】:

正如 cmets 中所述,由于 MVC 的库存验证,“必需”规则已经到位。此外,显然 MVC3 没有用于最小值的库存验证器,但仅用于范围...... 我建议你将自己的方法添加到验证器对象中,并将这条规则添加到对象中,像这样(来自API doc

$.validator.addMethod("min_counter", function (value, el) {
    return value > 1;
});

然后添加规则。注意上面的方法名是作为规则和消息对象的键重复的,这就是 validate() 方法知道运行什么方法来执行实际验证的方式。

$("#ROCounter").rules("add", {
    //this tells validator to evaluate only when the radio is checked. 
    //For example, if you put "true" here, the rule "min_counter" will be evaluated always.
    min_counter: $("#RO-Yes").is(":checked"), 
    messages: {
        min_counter: "Please enter further information"
    }
});

让我知道这是否适合你。

【讨论】:

  • 您好,TallMaris。所以我读这篇文章的方式是,将 'min_counter' 方法添加到验证器插件,然后通过将规则添加到 ROCounter div 来使用它,它说:“如果选中了 RO-Yes 按钮,那么ROCouner 需要大于 1" 对吗?无论哪种方式,我都收到一条错误消息:“无法读取未定义的属性'设置'”。
  • 错误是指 jquery.validate.js 文件中的 'settings' var,特别是这个点:“ rules: function(command, argument) { var element = this[0]; if (命令) { var settings = $.data(element.form, 'validator').settings; var staticRules = settings.rules; "
  • 我想知道是不是我运行的脚本太多,我有不显眼的验证 MicrosoftMVCValidation 和一个自定义的 FoolProof 验证,我正在针对某些领域提出诉讼。
  • 我减少了脚本,但仍然收到错误消息。我正在研究,但还没有找到答案。
  • rules.add() 部分只有在 $("form").validate() 如文档所说的那样被调用后才能工作。不显眼的验证实际上正在调用它,但也许这发生得太晚了......你可以尝试注释掉你的 rules.add() 并最终在所有内容完全加载时从控制台触发它吗?您还可以在执行此操作之前检查 $("form").data('validator') 是否已定义...
猜你喜欢
  • 2021-10-13
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多