MVC5 RadioButton для свойства модели не привязано должным образом

Я использую MVC5 с Razor. Моя viewmodel имеет свойство типа nullable enum. Я сделал его обнуляемым, чтобы при загрузке страницы пользователю приходилось выбирать опцию и проверять, когда он ничего не выбрал.

public class PaymentViewModel
{
        [Required(ErrorMessage = "Please select a payment method", AllowEmptyStrings = false)]
        public PaymentType? SelectedPaymentType { get; set; }
}

public enum PaymentType
{
    CreditCard,
    DirectDebit
}

На мой взгляд, у меня есть форма, и я вызываю submit, которая в свою очередь вызывает действие контроллера как сообщение.

Соответствующая часть моего взгляда выглядит так:

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

По какой-то причине значение, полученное в моей модели. PaymentType всегда равно нулю, хотя я выбрал переключатель. Я добавил атрибут @Id, так как заметил, что ему присваивается тот же идентификатор, если я его не указал, но это не помогло.

Я также проверил другое свойство строки, проходящее через сообщение, поэтому оно кажется специфичным для этой группы переключателей.

Если я сделаю свойство не обнуляемым, для него будет установлено значение 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>

1 ответ

Решение

Ваш рендеринг атрибута имени как 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>
Другие вопросы по тегам