私はMVC6を使用しており、フォームにチェックボックス入力フィールドがありますが、フォームが送信されると、チェックボックスの値は常にfalseとしてViewModelに渡されます:
これは、私のViewModelでプロパティがどのように宣言されるかです
[Display(Name = "Include Sales Tax")]
public bool IncludeSalesTax { get; set; }
MVC6かみそりフォームでフォームがどのように見えるかを以下に示します:
<div class="form-group">
<div class="checkbox">
<label><input asp-for="IncludeSalesTax" type="checkbox" value="">@Html.DisplayNameFor(m => m.IncludeSalesTax)</label>
</div>
</div>
Twitter Bootstrapの標準に従い、モデルバインディングにASP.NET MVC6 asp-forタグを使用するには、上記が最善の方法であると考えました。
フォームを送信すると、IncludeSalesTaxの値は、チェックされていても常にfalseです。私は何を間違えていますか?
Visual StudioにViewModelに基づいてフォームを生成させた後、次のようにします。
<div class="checkbox">
<input asp-for="isTaxable" />
<label asp-for="isTaxable"></label>
</div>
さらに、入力タグを閉じることができませんでした。 bootstrap推奨される方法であるこのように行うこともできます:
<label><input asp-for="isTaxable" type="checkbox" value=""/>@Html.DisplayNameFor(m => m.isTaxable)</label>
入力タイプのチェックボックスは、設定されている場合「オン」を送信します。それ以外の場合は送信されません。 value属性をtrueに設定することが重要です。この場合、trueまたは何も送信せず、ブール値にバインドするのに最適です。
<input type="checkbox" name="yourPropertyName" value="true" checked />
カミソリビューエンジンは、通常、同じ名前を使用してチェックボックスと1つの非表示入力を作成します。
以下のhtmlを使用するだけで、目的の結果を得ることができます。
<div class="form-group">
<div class="checkbox">
<input type="checkbox" value="true" name="IncludeSalesTax" />Include Sales Tax
<input type="hidden" value="false" name="IncludeSalesTax" />
</div>
</div>
上記のPinkiの答えは、チェックボックスがデフォルトでチェックされている場合に適しています。
チェックボックスがデフォルトでオフになっている場合、小さなインラインjavascriptをクリックすると、値がtrueまたはfalseに設定されます。
<input name="yourPropertyName" type="checkbox" value="false" onchange="this.value=this.checked">