24

一段时间以来,我一直试图让 MVC Jquery 不显眼的错误处理与 twitter 引导程序一起工作。它的重点是我要么编辑 jquery.validate 要么在 document.ready 上做一些破解和斜线。

为了让不显眼的错误处理与 Bootstrap 和 MVC 一起工作,我需要将其添加到“控制组”类中的“错误”类。除此之外,“错误”类被附加到输入中。

我想知道社区中是否有人已经找到了解决方案。

例如

典型的引导标记会像这样......

<div class="control-group">
    <label for="Username">Username</label>
    <div class="controls">
        <input data-val="true" data-val-required="Username is required" id="Username" name="Username" type="text" value="" />
        <span class="field-validation-valid" data-valmsg-for="Username" data-valmsg-replace="true"></span>
    </div>
</div>

当 jquery.validate unobtrusive 触发时模糊会发生什么......它将变为以下

<div class="control-group error">
    <label for="Username">Username</label>
    <div class="controls">
        <input data-val="true" data-val-required="Username is required" id="Username" name="Username" type="text" value="" />
        <span class="field-validation-valid help-inline" data-valmsg-for="Username" data-valmsg-replace="true"></span>
    </div>
</div>

要使其在回发/提交中起作用,您可以执行以下操作...

//twitter bootstrap on post
$(function () {
    $('span.field-validation-valid, span.field-validation-error').each(function () {
        $(this).addClass('help-inline');
    });

    $('form').submit(function () {
        if ($(this).valid()) {
            $(this).find('div.control-group').each(function () {
                if ($(this).find('span.field-validation-error').length == 0) {
                    $(this).removeClass('error');
                }
            });
        }
        else {
            $(this).find('div.control-group').each(function () {
                if ($(this).find('span.field-validation-error').length > 0) {
                    $(this).addClass('error');
                }
            });
        }
    });


    $('form').each(function () {
        $(this).find('div.control-group').each(function () {
            if ($(this).find('span.field-validation-error').length > 0) {
                $(this).addClass('error');
            }
        });
    });

});

但是,在模糊时,它不会像您期望的那样工作。我不想编辑引导 CSS 或 Jquery.validate 文件,因为它们可能会在某个时候推出更新。

我会创建一个委托,还是绑定到 jquery 函数并从那里开始工作。这是我不熟悉的深层 JS 代码,但随着时间的推移,我可以通过它来解决问题。

有谁知道我会从哪里开始解决这个问题,或者知道它在哪里实施/讨论过?

4

7 回答 7

28
var page = function () {
    //Update that validator
    $.validator.setDefaults({
        highlight: function (element) {
            $(element).closest(".control-group").addClass("error");
        },
        unhighlight: function (element) {
            $(element).closest(".control-group").removeClass("error");
        }
    });
} ();

最后,这为我解决了这个问题。我希望这对其他人也有帮助......

我最后的 JS 就这样结束了。

$(function () {
    $('span.field-validation-valid, span.field-validation-error').each(function () {
        $(this).addClass('help-inline');
    });

    $('form').submit(function () {
        if ($(this).valid()) {
            $(this).find('div.control-group').each(function () {
                if ($(this).find('span.field-validation-error').length == 0) {
                    $(this).removeClass('error');
                }
            });
        }
        else {
            $(this).find('div.control-group').each(function () {
                if ($(this).find('span.field-validation-error').length > 0) {
                    $(this).addClass('error');
                }
            });
        }
    });


    $('form').each(function () {
        $(this).find('div.control-group').each(function () {
            if ($(this).find('span.field-validation-error').length > 0) {
                $(this).addClass('error');
            }
        });
    });

});


var page = function () {
    //Update that validator
    $.validator.setDefaults({
        highlight: function (element) {
            $(element).closest(".control-group").addClass("error");
        },
        unhighlight: function (element) {
            $(element).closest(".control-group").removeClass("error");
        }
    });
} ();
于 2012-04-19T16:20:51.070 回答
10

这是一个很好的解决方案...

将此添加到您的_Layout.cshtml文件之外jQuery(document).ready()

<script type="text/javascript">

jQuery.validator.setDefaults({
    highlight: function (element, errorClass, validClass) {
        if (element.type === 'radio') {
            this.findByName(element.name).addClass(errorClass).removeClass(validClass);
        } else {
            $(element).addClass(errorClass).removeClass(validClass);
            $(element).closest('.control-group').removeClass('success').addClass('error');
        }
    },
    unhighlight: function (element, errorClass, validClass) {
        if (element.type === 'radio') {
            this.findByName(element.name).removeClass(errorClass).addClass(validClass);
        } else {
            $(element).removeClass(errorClass).addClass(validClass);
            $(element).closest('.control-group').removeClass('error').addClass('success');
        }
    }
});

</script>

在里面添加这个$(document).ready()

$("span.field-validation-valid, span.field-validation-error").addClass('help-inline');
$("div.control-group").has("span.field-validation-error").addClass('error');
$("div.validation-summary-errors").has("li:visible").addClass("alert alert-block alert-error");

你可以走了。


代码片段取自:

使用 ASP.NET MVC 的 Twitter Bootstrap 验证样式

将 Bootstrap 错误样式与 MVC 的不显眼的错误验证集成

@daveb 的回答

于 2013-02-01T16:38:22.300 回答
6

除了@leniel-macaferi 提供的答案之外,我还使用以下内容作为我的 $(document).ready() 函数:

$(function () {
    $("span.field-validation-valid, span.field-validation-error").addClass('help-inline');
    $("div.control-group").has("span.field-validation-error").addClass('error');
    $("div.validation-summary-errors").has("li:visible").addClass("alert alert-block alert-error");
});

如果服务器端验证在表单发布上失败,这也会在控制组上设置“错误”类,并将任何验证摘要格式化为引导错误警报。

于 2013-08-08T20:10:57.237 回答
4

我知道这是个老生常谈,但我想我会分享我的答案以更新 Bootstrap 3。在构建 Leniel Macaferi 提供的解决方案之前,我摸索了很长一段时间。

除了更改类以反映 Bootstrap 3 之外,我认为向用户展示一个代表字段状态的字形图标会是一个不错的选择。

(function ($) {
var defaultOptions = {
    errorClass: 'has-error has-feedback',
    validClass: 'has-success has-feedback',
    highlight: function (element, errorClass, validClass) {
        var _formGroup = $(element).closest(".form-group");
        _formGroup
            .addClass('has-error')
            .removeClass('has-success');

        if (!_formGroup.hasClass("has-feedback")) {
            _formGroup.addClass("has-feedback");
        }

        var _feedbackIcon = $(element).closest(".form-group").find(".glyphicon");
        if (_feedbackIcon.length) {
            $(_feedbackIcon)
                .removeClass("glyphicon-ok")
                .removeClass("glyphicon-remove")
                .addClass("glyphicon-remove");
        }
        else {
            $("<span class='glyphicon glyphicon-remove form-control-feedback' aria-hidden='true'></span>")
                .insertAfter(element);
        }
    },
    unhighlight: function (element, errorClass, validClass) {
        var _formGroup = $(element).closest(".form-group");
        _formGroup
            .removeClass('has-error')
            .addClass('has-success');

        if (!_formGroup.hasClass("has-feedback")) {
            _formGroup.addClass("has-feedback");
        }

        var _feedbackIcon = $(element).closest(".form-group").find(".glyphicon");
        if (_feedbackIcon.length) {
            $(_feedbackIcon)
                .removeClass("glyphicon-ok")
                .removeClass("glyphicon-remove")
                .addClass("glyphicon-ok");
        }
        else {
            $("<span class='glyphicon glyphicon-ok form-control-feedback' aria-hidden='true'></span>")
                .insertAfter(element);
        }
    }
};

$.validator.setDefaults(defaultOptions);

$.validator.unobtrusive.options = {
    errorClass: defaultOptions.errorClass,
    validClass: defaultOptions.validClass,
};

})(jQuery);
于 2015-02-13T23:24:07.580 回答
2

尝试使用我制作的这个插件https://github.com/sandrocaseiro/jquery.validate.unobtrusive.bootstrap

我所做的与其他答案不同的是用我自己的实现覆盖 validate.unobtrusive 中的errorPlacementandsuccess方法,但不删除原始实现,所以什么都不会破坏。

我的实现如下所示:
erroPlacement:

function onError(formElement, error, inputElement) {
    var container = $(formElement).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
        replaceAttrValue = container.attr("data-valmsg-replace"),
        replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;

    //calling original validate.unobtrusive method
    errorPlacementBase(error, inputElement);

    if (replace) {
        var group = inputElement.parent();
        if (group.hasClass('form-group')) {
            group.addClass('has-error').removeClass('has-success');
        }
        group = group.parent();
        if (group.hasClass('form-group')) {
            group.addClass('has-error').removeClass('has-success');
        }
    }
}

成功:

function onSuccess(error) {
    var container = error.data("unobtrusiveContainer");

    //calling original validate.unobtrusive method
    successBase(error);

    if (container) {
        var group = container.parent();
        if (group.hasClass('form-group')) {
            group.addClass('has-success').removeClass('has-error');
        }
        group = group.parent();
        if (group.hasClass('form-group')) {
            group.addClass('has-success').removeClass('has-error');
        }
    }
}
于 2014-02-10T13:14:11.727 回答
0

开箱即用,我想通过模糊来提高我的错误验证。我发现 Jquery Unobtrusive 并非如此。如果您有选择输入但没有文本类型输入,它似乎可以工作。为了解决这个问题,也许它很笨拙,但我使用了以下方法。

$(function () {
    $("input[type='text']").blur(function () {
        $('form').validate().element(this);
    });
});

您可以更改它只是在具有特定 css 类的某些输入上启用。

$(function () {
    $(".EnableOnblurUnobtrusiveValidation").blur(function () {
        $('form').validate().element(this);
    });
});

EnableOnblurUnobtrusiveValidation... 是一个有点长的名字,但你明白了。

于 2012-04-21T11:51:01.257 回答
-1

使用TwitterBootstrapMvc

它会自动处理不显眼的验证属性,您只需编写一个带有标签、输入和验证的完整控制组:

@Html.Bootstrap().ControlGroup().TextBoxFor(x => x.Field)

祝你好运!

于 2013-07-08T11:00:38.697 回答