web-dev-qa-db-ja.com

JavaScriptによる必要な検証を無効にする

オブジェクトを作成するための作成フォームがあります。モデルの作成には、チェックボックスがオンになっている場合にのみ表示され(.hide、.show())、必須とマークされている(モデルの属性によって)いくつかのプロパティがあります。

残念ながら、チェックボックスがチェックされていない場合、必要な検証は非表示のプロパティに対して実行されます。

このプロパティに必要な検証を無効にするにはどうすればよいですか?

Input要素のdata-valプロパティをfalseに設定しようとしましたが、これは機能しません。

いくつかのアイデア?

よろしくお願いしますトビアス

更新:

これがJavaスクリプトコードです。data-valプロパティが正しくfalseに設定されています。検証ではこのプロパティが考慮されていないようです。data-val-required属性もありますが、バックアップできなかったテキストです。

$(function () {
                $("#MyCheckbox")
                    .change(function () {
                        if (this.checked) {
                            $("#divWithChildProperties [data-val]").attr("data-val", true);
                            $("#divWithChildProperties ").show();
                        }
                        else {
                            $("#divWithChildProperties [data-val]").attr("data-val", false);
                            $("#divWithChildProperties ").hide();
                        }
                    })
            });
9
Tobias

私はこのようなケースをカスタム検証属性で処理しました。プロパティにRequired属性を使用する代わりに、RequiredIf属性を作成し、別のプロパティが特定の値である場合にのみ一部のプロパティを必須にすることができます。

このような属性の作成に関する投稿は次のとおりです(ページ中央の「より複雑なカスタムバリデーター」セクションの例): http://www.devtrends.co.uk/blog/the -complete-guide-to-validation-in-asp.net-mvc-3-part-2

チェックボックスがモデルのプロパティを表す場合、これは正常に機能するはずです。

新しい検証属性でこれを処理したくない場合は、data-val属性をfalseに変更するだけでなく、さらにいくつかのことを行う必要があります。 jQuery validateが最初にフォームを解析するとき、フォームのデータに値を格納します。したがって、data-valを変更するだけでは不十分です。さらに、保存されている検証データを削除して、フォームを再解析する必要があります。次に例を示します。

// Do this after you've removed/modified the data-val attribute
$('selector for your form').removeData('unobtrusiveValidation');
$('selector for your form').removeData('validator');
$.validator.unobtrusive.parse('selector for your form');
22
bbak

次のJQueryを使用して、要素のすべての検証ルールを削除できます

$('#ElementId').rules('remove');

同じように使用できますクラス名のように、

$('.ElementClassName').rules('remove');

特定のルールを削除したい場合は、次のようにします

$('#ElementId').rules('remove', 'required');
6
Karthikeyan P

MVCが提供する控えめなJavaScriptプラグインは、データプロパティをその場で処理しません。代わりに、ドキュメントレディの結果を解析してキャッシュします。

問題のプロパティを変更した後、フォームで$.validator.unobtrusive.parse(myForm)を呼び出して、期待どおりの結果が得られるかどうかを確認してください。

2

Javascriptで控えめな検証を無効にする方法はたくさんありますが、それらのほとんどは少しハックなようです...

  1. 最近、送信ボタンでそれを行うことができることがわかりました。このリンクで情報を確認してください

http://www.nitrix-reloaded.com/2013/09/16/disable-client-side-validation-on-a-button-click-asp-net-mvc/

//this
<script type="text/javascript">
  document.getElementById("backButton").disableValidation = true;
</script>
//or this
<input type="submit" name="backButton" value="Back" 
 title="Go back to Prev Step" disableValidation="true" />
//or this
<input type="submit" name="backButton" value="Back"
 title="Go back to Prev Step" class="mybtn-style cancel" />
  1. より柔軟ですがより複雑な別の方法:data-val属性をfalseに設定することで、目立たない検証を無効にできます。しかし、トリックがあります...

ドキュメントの準備ができると、目立たない検証データがキャッシュされます。つまり、最初にdata-val='true'があり、後で変更した場合でも、trueのままになります。

したがって、ドキュメントの準備ができた後で変更する場合は、キャッシュされたデータを消去するバリデーターもリセットする必要があります。これがそれを行う方法です:

disableValidation: function () {
    //Set the attribute to false
    $("[data-val='true']").attr('data-val', 'false');

    //Reset validation message
    $('.field-validation-error')
    .removeClass('field-validation-error')
    .addClass('field-validation-valid');

    //Reset input, select and textarea style
    $('.input-validation-error')
    .removeClass('input-validation-error')
    .addClass('valid');

    //Reset validation summary
    $(".validation-summary-errors")
    .removeClass("validation-summary-errors")
    .addClass("validation-summary-valid");

    //To reenable lazy validation (no validation until you submit the form)
    $('form').removeData('unobtrusiveValidation');
    $('form').removeData('validator');
    $.validator.unobtrusive.parse($('form'));
},

フォームを送信できるようにするために、すべてのメッセージ、入力スタイル、および検証の概要をリセットする必要はありませんが、ページの読み込み後に検証を変更する場合に役立ちます。そうしないと、検証を変更しても、以前のエラーメッセージが表示されたままになります...

0
Gudradain

目立たない検証では、この属性を探します_data-val="true"_

$('#mycheckbox').data('val','false')を実行すると、検証はそのIDのアイテムをスキップすると思います。

おそらくそれを行うためのより適切な方法がありますが、そうでない場合は、これを取ります。

乾杯。

0
vtortola