5

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>
4

1 に答える 1

7

name 属性を次のようにレンダリングしますが、モデルのプロパティ名と一致するname="payment-method"必要があります。属性も必要ありませんをSelectedPaymentType削除します{ @name = "payment-method",value

より使いやすくするために( 付き<label>

@Html.RadioButtonFor(m=> m.SelectedPaymentType, PaymentType.CreditCard, new {@Id="rdoCredit"})
<label for="rdoCredit">Credit Card</label>
@Html.RadioButtonFor(m=> m.SelectedPaymentType, PaymentType.DirectDebit, new {@Id="rdoDebit"})
<label for="rdoDebit">Direct De</label>
于 2014-09-18T06:21:12.650 に答える