一旦我将@Html.DropDownListFor 添加到表单中,Jquery.Validate 就会停止验证任何控件

Posted

技术标签:

【中文标题】一旦我将@Html.DropDownListFor 添加到表单中,Jquery.Validate 就会停止验证任何控件【英文标题】:Jquery.Validate stops validating any controls once I add @Html.DropDownListFor to the form 【发布时间】:2019-09-08 18:39:17 【问题描述】:

我有一个带有多个控件的表单,这些控件使用 Jquery.Validate 进行了验证。在我使用@html.DropDownListFor 添加新行之前,它们都可以正常工作。控制台中没有出现错误,验证器只是停止工作。当我说停止工作时,我的意思是没有任何东西以红色突出显示,我的 btnClick 说表单是有效的。

//This works
<div class="col-sm-5">
@Html.LabelFor(m => m.PublicationName, new  @class = "control-label" )
@Html.TextBoxFor(m => m.PublicationName, new  @class = "form-control" )
</div>

//Adding this causes everything to stop validating
//Using the Select2 Plugin
@Html.LabelFor(m => m.JournalistId, new  @class = "control-label" )
@Html.DropDownListFor(m => m.JournalistId,
(SelectList)ViewBag.Journalists,  new  @class = "form-control" 
)

生成的 HTML

<div class="col-sm-5">
<label class="control-label" for="JournalistId">Author</label>
<select class="form-control select2-hidden-accessible valid" data-val="true" data-val-number="The field Author must be a number." id="JournalistId" name="JournalistId" data-select2-id="JournalistId" tabindex="-1" aria-hidden="true" aria-describedby="JournalistId-error"><option value="" data-select2-id="2">Select</option>
<option value="346">Name 1</option>
<option value="381">Name 2</option>
</select><span class="select2 select2-container select2-container--default" dir="ltr" data-select2-id="1" style="width: 357.5px;"><span class="selection"><span class="select2-selection select2-selection--single" role="combobox" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-labelledby="select2-JournalistId-container"><span class="select2-selection__rendered" id="select2-JournalistId-container" role="textbox" aria-readonly="true" title="Select">Select</span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span></span></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>
 </div>

我的模特

    [Display(Name = "Publication Name")]
    public string PublicationName  get; set; 

    public int? PublicationId  get; set; 

    public string Journalist  get; set; 

    [Display(Name = "Author")]
    public int? JournalistId  get; set; 

我的脚本

$(function () 

    $('.btnNext').click(function (e) 
        if ($("#form1").valid()) 
            alert('valid');
         else 
            alert('not valid');
        
    );

    $("#form1").validate(
        rules: 
            PublicationName: 
                required: true,
                minlength: 2
            
        ,
        messages: 
            PublicationName: 
                required: "Please enter a Publication Name",
                minlength: "Your username must consist of at least 2 characters"
            
        ,
        errorElement: "em",
        errorPlacement: function (error, element) 
            // Add the `help-block` class to the error element
            error.addClass("help-block");

            // Add `has-feedback` class to the parent div.form-group
            // in order to add icons to inputs
            element.parents(".col-sm-5").addClass("has-feedback");

            if (element.prop("type") === "checkbox") 
                error.insertAfter(element.parent("label"));
             else 
                error.insertAfter(element);
            

            // Add the span element, if doesn't exists, and apply the icon classes to it.
            if (!element.next("span")[0]) 
                $("<span class='glyphicon glyphicon-remove form-control-feedback'></span>").insertAfter(element);
            
        ,
        success: function (label, element) 
            // Add the span element, if doesn't exists, and apply the icon classes to it.
            if (!$(element).next("span")[0]) 
                $("<span class='glyphicon glyphicon-ok form-control-feedback'></span>").insertAfter($(element));
            
        ,
        highlight: function (element, errorClass, validClass) 
            $(element).parents(".col-sm-5").addClass("has-error").removeClass("has-success");
            $(element).next("span").addClass("glyphicon-remove").removeClass("glyphicon-ok");
        ,
        unhighlight: function (element, errorClass, validClass) 
            $(element).parents(".col-sm-5").addClass("has-success").removeClass("has-error");
            $(element).next("span").addClass("glyphicon-ok").removeClass("glyphicon-remove");
        
    );

);

【问题讨论】:

如果不调用.rules() 为新字段动态添加规则,您将无法向表单动态添加新字段。一个例外是包含用于规则声明的内联属性的任何字段。 我没有动态添加控件。我的意思是,在设计表单时,一切正常,直到我添加下拉列表,然后整个表单停止验证。 那么您需要向我们展示呈现的 HTML 标记。 我已经添加了生成的 HTML 那是因为 Unobtrusive Validation 构造和调用.validate(),它完全优先于你对这个方法的调用。最初使用“不显眼的验证”标记问题可能对我们有所帮助。 【参考方案1】:

啊,原来我已经加载了 jquery.validate.unobtrusive.js,一旦我删除它,所有控件都开始正确验证。

【讨论】:

对,因为您只能调用.validate() 一次,而忽略所有其他调用。由于 Unobtrusive Validation 会自动构造/调用.validate(),因此您的会被忽略。但是,您最初的问题无法回答,因为它没有解释在您添加下拉列表之前它是如何工作的。要么您安装了 Unobtrusive,要么您没有安装。

以上是关于一旦我将@Html.DropDownListFor 添加到表单中,Jquery.Validate 就会停止验证任何控件的主要内容,如果未能解决你的问题,请参考以下文章

Html.DropdownListFor 未设置所选值

Html.DropDownListFor() 二级联动 ($.getJSON)

c# mvc关于@Html. DropDownListFor() 或@Html.EnumDropDownListFor() 设置disabled="disabled" post(代

为什么DropDownListFor的默认值无法正常工作?

Asp.Net MVC中DropDownListFor的用法(转)

ASP.NET @Html.DropDownListFor() 选择的值设置为 true 但提交给控制器时返回 false