如何在bootstrap-combobox上显示jquery验证错误?

时间:2015-03-12 19:08:54

标签: javascript jquery jquery-validate

我从这里开始使用这个非常酷的bootstrap-combobox:https://github.com/danielfarrell/bootstrap-combobox

我目前有一个.NET MVC 5项目,该项目使用开箱即用的验证(jquery unobstrusive validation),并且任何验证错误都不会出现在combobox控件中。我的问题类似于这里的问题(遗憾的是它没有答案):boostrap combobox validation - is it possible?

我花了一些时间为它创建一个jsfiddle:http://jsfiddle.net/1doe359f/3/

HTML:

<form id="experiment" action="/" method="post">
<div class="form-group">
    <label class="control-label" for="PersonID">Person</label>
    <select class="form-control combobox" data-val="true" data-val-required="This field is required." id="PersonID" name="PersonID">
        <option value=""></option>
        <option value="5">Bruce Banner</option>
        <option value="9">Bugs Bunny</option>
        <option value="8">Daffy Duck</option>
        <option value="10">Elmer Fudd</option>
        <option value="6">Jean Grey</option>
        <option value="4">Clark Kent</option>
        <option value="3">Peter Parker</option>
        <option value="7">Scott Summers</option>
    </select> <span class="field-validation-valid" data-valmsg-for="PersonID" data-valmsg-replace="true"></span>
</div>
<p>
    <button type="submit" value="Save" role="button" class="btn btn-default" aria-disabled="false">Save</button>
</p>

使用Javascript:

var validator = {};
  $(document).ready(function () {
  $('.combobox').combobox();
  var $form = $("#experiment");
  // prevent form submission
  $form.submit(function (e) {
      e.preventDefault();
      return false;
  });
  validator = $form.validate();
});

如果你删除&#34; combobox&#34;从控件的类中点击保存按钮,您可以看到弹出的错误消息。但是,当控件是组合框时,它不会显示出来。

如何在使用此组合框控件时显示验证器错误?

通常我可以偶然发现这种事情,但这对于像我这样的javascript新手来说有一些太多的动作部分。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

我在该验证函数中使用了errorPlacement来处理特别麻烦的控件。

errorPlacement: function (error, element) {
                // Set positioning based on the elements position in the form
                var elem = $(element);
                // Check we have a valid error message
                if (!error.is(':empty')) {
                    if (elem.is(':combobox')){...logic here}

我使用过的控件周围有一个容器,导致错误隐藏而不是显示在容器上。

答案 1 :(得分:0)

我最终确实得到了这项工作,但这不是一个漂亮的解决方案。我在bootstrap-combobox代码中做了这个改变:

/* COMBOBOX PLUGIN DEFINITION
* =========================== */
$.fn.combobox = function ( option ) {
    return this.each(function () {
    var $this = $(this)
      , data = $this.data('combobox')
      , options = typeof option == 'object' && option;

    if (!data) { $this.data('combobox', (data = new Combobox(this, options))); }
    if (typeof option == 'string') { data[option](); }

    /* Added stuff to get jquery validation working */
    data.$element.attr("name", data.$source.attr("id"));
    data.$element.attr("data-val", data.$source.attr("data-val"));
    data.$element.attr("data-val-required", data.$source.attr("data-val-required"));
    data.$element.closest("form").removeData("validator").removeData("unobstrusiveValidation");
    $.validator.unobtrusive.parse(data.$element.closest("form"));
  });
};

这里的gyst是我将相关属性(name,data-val,data-val-required)从原始下拉列表($ source)复制到组合框控件($ element),然后我重置验证器它承认这个新制造的控制。

仅供参考:这不是一个很好的方法,因为它在bootstrap-combobox中创建了对jquery验证器的依赖,而且它是不灵活的(只会执行&#39; required&#39; check)。我采用这种快捷方式的一个原因是生成的控件没有任何好的标识符,所以使用这个库存引用要容易得多。

它确实有效,如果你只是做了“必要的”。检查你的组合框并只在项目中使用jquery验证,这就足够了。希望它至少可以为将来节省一些时间提供一些见解。