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>