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 検証スタイル

ブートストラップ エラー スタイルと MVC の控えめなエラー検証の統合

@davebの答え

于 2013-02-01T16:38:22.300 に答える
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メソッドを独自の実装でオーバーライドすることでしたが、元の実装を削除することなく、何も壊れません。

私の実装は次のようになります
:

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 に答える