首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未正确绑定MVC5 RadioButtonFor模型属性

未正确绑定MVC5 RadioButtonFor模型属性
EN

Stack Overflow用户
提问于 2014-09-18 13:38:43
回答 1查看 14K关注 0票数 5

我使用的是带有剃刀视图的MVC5。我的视图模型有一个可以为空的枚举类型的属性。我让它可以为空,这样当用户加载页面时,他们必须选择一个选项,并在没有选择任何内容时进行验证。

代码语言:javascript
复制
public class PaymentViewModel
{
        [Required(ErrorMessage = "Please select a payment method", AllowEmptyStrings = false)]
        public PaymentType? SelectedPaymentType { get; set; }
}

public enum PaymentType
{
    CreditCard,
    DirectDebit
}

在我看来,我有一个表单,正在调用submit,它反过来调用一个控制器操作作为post。

我的视图的相关部分如下所示:

代码语言:javascript
复制
<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上的值总是空的,即使我选择了一个单选按钮。我添加了@Id属性,因为我注意到,如果我不指定一个Id,它将被赋予相同的Id,但这没有帮助。

我还测试了post上的另一个字符串属性,因此它似乎特定于这个属性/单选按钮组。

如果我将该属性设置为不可为空,它将被设置为CreditCard (枚举的第一个值),如果我选择了DirectDebit单选选项并提交表单,它仍然会显示为CreditCard。

(我确信我可以把标签做得更好,但我现在关心的是让绑定正常工作

编辑。生成的html是:

代码语言:javascript
复制
<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>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-18 14:21:13

您将name属性呈现为name="payment-method",但它应该是SelectedPaymentType以匹配您的模型属性名称。删除也不需要的value属性的{ @name = "payment-method",

更好的可用性(使用<label>)

代码语言:javascript
复制
@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>
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25904924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档