2017-09-13 15 views
0

のために逆に動作します。しかしそれは逆に働く。それは私が逆ではなくチェックボックスをチェックするとエラーメッセージを表示しています。私はどこが間違っているのか分かりません。必要なチェックボックスの検証は私がページを送信する前に私は、チェックボックスの検証を持ってHtml.CheckBoxFor

私のViewModel

[Display(Name = "Terms and Conditions")] 
[Range(typeof(bool), "true", "true", ErrorMessage = "Please accept Terms & Conditions")] 
public bool IsTermsAccepted { get; set; } 

マイビュー

<div class="row col-lg-offset-2 top-buffer"> 
       @Html.CheckBoxFor(model => model.IsTermsAccepted) 
       @Html.LabelFor(model => model.IsTermsAccepted) 
      <br>@Html.ValidationMessageFor(model => model.IsTermsAccepted) 
     </div> 

お時間をいただき、ありがとうございます!

EDIT1:私は正確にhere

EDIT2のように続く:私はあなたが必要とする(上記のリンクに示すように)簡単なスクリプトを追加することによってこの問題を解決することができた

<script> 
// extend range validator method to treat checkboxes differently 
var defaultRangeValidator = $.validator.methods.range; 
$.validator.methods.range = function(value, element, param) { 
    if(element.type === 'checkbox') { 
     // if it's a checkbox return true if it is checked 
     return element.checked; 
    } else { 
     // otherwise run the default validation function 
     return defaultRangeValidator.call(this, value, element, param); 
    } 
} 

答えて

2

:とどのようにチェックボックスがHTMLでの作業( https://stackoverflow.com/a/11424091/159145この質問に対する私の答えを参照してください) - どのように CheckBoxFor ASP.NET MVCでの作品を理解します彼らはチェックされない場合は
  • HTMLのチェックボックスはPOSTリクエストボディにその価値を投稿しないでください。
  • "チェックボックス非チェック"と "チェックボックス除外"の違いを伝えるには、<input type="hidden" />という明示的な「偽」値を、チェックボックス入力と同じname=""のプロパティ値で含める必要があります。
  • ASP.NET MVCはあなたのためにこれを行います。Html.CheckBoxFor()はあなたのページのレンダリングされたHTMLを見れば、あなたはそれらの両方が表示されます<input type="checkbox" value="true" /><input type="hidden" value="false" />
    • の両方をレンダリングします。 truefalse:あなたがチェックチェックボックスを提出する際に

ので、お使いのブラウザは、実際に値を送信しています。それはまた、true値を送っていても、あなたのRangeバリデータが失敗し"false"値です。

しかしRangeValidatorAttributeは、CheckBoxForを使用して設定されたブール値のViewModelプロパティに対してこの特定のケースを処理するほどスマートではありません。

私の知る限りでは、そこにこのケースを扱う組み込みのDataAnnotation属性ではありません - あなたはそうのように、あなたのコントローラのアクションでそれを自分で実装する必要があります:あなたは

[HttpPost] 
public IHttpActionResult Foo(FooViewModel model) { 

    if(!model.IsTermsAccepted) { 

     this.ModelState.AddModelError(nameof(model.IsTermsAccepted), "you must accept the terms."); 
     return this.View(model); 
    } 

} 

が...か自分で新しい検証属性を実装しようとする可能性があります。このようなことを行う必要があります。あなたはプロパティは、すなわち(リクエストボディ内の値を有する両方のことを確認する必要がありますので、それは、Required属性から派生し

注意チェックボックスが応答に含まれ、非表示の入力)は、trueの値が存在することを示します。

[AttributeUsageAttribute(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] 
class CheckboxIsCheckedAttribute : RequiredAttribute { 

    public override bool IsValid(Object value) { 

     Boolean isRequiredValid = base.IsValid(value); 
     if(!isRequiredValid) return false; 

     return (value as Boolean) == true; 
    } 
} 
+0

良い説明が、それはRequiredAttribute' 'から派生してはならないことに注意してください - ちょうどValidationAttribute''から(そのaが 'bool'以来、とにかく、デフォルトで必要と何がある場合は、検証エラーが既に追加されません応答の値)。さらに、 'RequiredAttribute'から派生した場合、' global.asax'にも登録する必要があります(dazbradburyの回答は正しいアプローチであり、クライアント側の検証も行います) –

関連する問題