概要
「Qiita - HTML チェックボックスでfalseも判定する」を見て、
ASP.NET Core MVCでも値を送れるのか試したところ、
下記の並び順では無理でした。
<input type="hidden" name="test" value="0">
<input type="checkbox" name="test" value="1">
軽く説明
asp-for="Test"は、HTMLの属性id="Test"とname="Test"として
展開され、submitした際にname="Test"が捕捉され、
サーバへデータが飛びます。
Microsoftは捻くれており、nameが重複して存在した場合、
最初に現れたnameのみをサーバに送ってくれるので
<input type="hidden" name="test" value="0">
が先にあると後ろのチェック状態がどうであろうと
type="hidden"のvalue="0"しか送られなくなります。
解決方法
チェックボックスより後ろに書く
<form action="/" method="post">
<input type="checkbox" asp-for="Test" value="1">
<input type="hidden" asp-for="Test" value="0"> @*後ろに書く*@
<button>送信</button>
</form>
まとめ
これがMicrosoft Quality...
補足すると同名の複数チェックボックスの取得は、ビューモデルの型に
List<bool>やList<string>を使うことで可能となっています。
チェックボックスにチェックが無い場合に、0を送りたいという
要件はhiddenの要素をチェックボックスより後ろに書くことで
可能となります。