Razor ビューで MVC5 を使用しています。私のビューモデルには、nullable 列挙型のプロパティがあります。ユーザーがページをロードするときにオプションを選択し、何も選択していないときに検証する必要があるように、null 可能にしました。
public class PaymentViewModel
{
[Required(ErrorMessage = "Please select a payment method", AllowEmptyStrings = false)]
public PaymentType? SelectedPaymentType { get; set; }
}
public enum PaymentType
{
CreditCard,
DirectDebit
}
私の見解では、フォームがあり、送信を呼び出しています。これにより、コントローラーアクションが投稿として呼び出されます。
私のビューの関連部分は次のようになります。
<div class="row button-group" data-toggle="buttons">
<div class="col-xs-6">
<label class="btn btn-tertiary">
@Html.RadioButtonFor(model => model.SelectedPaymentType, PaymentType.CreditCard, new {@Name = "payment-method", @Value = "credit", @Id="rdoCredit"})
Credit Card
</label>
</div>
<div class="col-xs-6">
<label class="btn btn-tertiary">
@Html.RadioButtonFor(model => model.SelectedPaymentType, PaymentType.DirectDebit, new {@Name = "payment-method", @Value = "debit", @Id="rdoDebit"})
Direct Debit
</label>
</div>
</div>
何らかの理由で、ラジオ ボタンを選択したにもかかわらず、model.PaymentType の値が常に null になります。@Id 属性を追加したのは、指定しなかった場合に同じ ID が与えられていることに気付いたからですが、それは役に立ちませんでした。
また、別の文字列プロパティが投稿されていることもテストしたので、このプロパティ/ラジオ ボタン グループに固有のようです。
プロパティを null 不可にすると、CreditCard (列挙型の最初の値) に設定されます。また、DirectDebit ラジオ オプションを選択してフォームを送信しても、CreditCard であると表示されます。
(私はラベルをもっとうまくやることができると確信していますが、今のところ私の懸念はバインディングが適切に機能することです
編集。生成される html は次のとおりです。
<form method="post" action="/myapplication/payment" novalidate="novalidate">
....
<div data-toggle="buttons" class="row button-group">
<div class="col-xs-6">
<label class="btn btn-tertiary">
<input type="radio" checked="checked" value="credit" name="payment-method" id="rdoCredit">
Credit Card
</label>
</div>
<div class="col-xs-6">
<label class="btn btn-tertiary">
<input type="radio" value="debit" name="payment-method" id="rdoDebit">
Direct Debit
</label>
</div>
</div>
...
</form>