web-dev-qa-db-ja.com

テキストボックスに目立たない検証エラーを手動で設定する

リモート検証と同様のことを行っていますが、jqueryを介して手動で呼び出しを行い、セットアップする必要があるものをセットアップしている点が異なります。

ここでの私の問題は、特定のテキストボックスが無効であることをバリデーターに伝えたい場合(そしてページの送信を妨げたり、テキストボックスを強調表示したりする場合など)です。コードからこれをどのように行うのですか?

@Html.LabelFor(m => Model.Slug)
@Html.TextBoxFor(m => Model.Slug)
<span id="UrlMsg" class="field-validation-error" style="display: none;"></span>

 if (error) {
        $('#UrlMsg').html('This name is already in use.').fadeIn('fast');
        //what should I do here for the rest of the validation?
 }
20
Shawn Mclean

まず、検証の概要を追加できます。

@Html.ValidationMessageFor(m => m.Slug)

次に、.showErrorメソッドを使用してjQuery検証/控えめな検証を手動でトリガーできます。サンプルは次のとおりです。

var errorArray = {};
errorArray["Slug"] = 'Some error message for the Slug text box';
$('#SomeFormId').validate().showErrors(errorArray);
50
SkipHarris

次のこともできます。

@Html.ValidationMessageFor(m => m.Slug)

コードでこの関数を使用すると:

function setError(id, message) {
        var span = $("span[data-valmsg-for=\"" + id + "\"]");
        if (span && span.length > 0) {
            $(span).html(message);
            if (message && message != "") {
                $(span).removeClass("field-validation-valid");
                $(span).addClass("field-validation-no-valid");
            } else {
                $(span).removeClass("field-validation-no-valid");
                $(span).addClass("field-validation-valid");
            }
        }
    }

次に、エラーを設定できます

setError("Slug", "errorMsg");
3
FRL

ShowErrorsを使用するとエラーが持続しなかったため、.valid()を実行するとエラーがクリアされました。代わりに、「forcibleerror」ルールとjavascriptメソッドを追加してメッセージを設定しました。

function forceError(element, errorMessage) {
    $(element).rules("add", {
        forcibleerror: true,
        messages: {
            forcibleerror: function () { return errorMessage; }
        }
    });
    var isForced = false;
    if (errorMessage) {
        isForced = true;
    }
    $(element)[0].dataset.isForced = isForced;
    $(element).valid();
}
$.validator.addMethod("forcibleerror", function (value, element) {
    return $(element)[0].dataset.isForced !== "true";
});

使用法:

forceError($('#Slug'), 'my custom message');

有効な状態に戻すには:

forceError($('#Slug'), '');
2
kevinpo

これは、FRLの回答を改善したものです。

@Html.ValidationMessageFor(m => m.Slug)

JS機能

        const span = $('span[data-valmsg-for="' + name + '"]');
        function setError(name, message) {
            const span = $(`span[data-valmsg-for="${name}"]`);
            if (span && span.length > 0) {
                $(span).html(message);
                if (message) {
                    $(`input[name="${name}"]`).addClass("input-validation-error");
                    $(span).removeClass("field-validation-valid");
                    $(span).addClass("field-validation-error");
                } else {
                    $(`input[name="${name}"]`).removeClass("input-validation-error");
                    $(span).removeClass("field-validation-error");
                    $(span).addClass("field-validation-valid");
                }
            }
        }

あれを呼べ

    setError("Slug", "errorMsg");
1
shlgug