强类型 RadioButtonlist

Posted

技术标签:

【中文标题】强类型 RadioButtonlist【英文标题】:Strongly Typed RadioButtonlist 【发布时间】:2011-08-05 08:18:51 【问题描述】:

我想获得一些选项(比如支付方式现金、信用卡等)并将它们绑定到单选按钮。我相信 MVC 3 中没有 RadioButtonList。

此外,一旦绑定了收音机,我想在编辑答案时向用户显示之前选择的选项。

【问题讨论】:

我的博客上有一个 html 助手,可能会帮助到jonlanceley.blogspot.com/2011/06/… 【参考方案1】:

一如既往地从模型开始:

public enum PaiementMethod

    Cash,
    CreditCard,


public class MyViewModel

    public PaiementMethod PaiementMethod  get; set; 

然后是控制器:

public class HomeController : Controller

    public ActionResult Index()
    
        var model = new MyViewModel();
        return View(model);
    

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    
        return View(model);
    

最后是一个视图:

@model MyViewModel
@using (Html.BeginForm())

    <label for="paiement_cash">Cash</label>
    @Html.RadioButtonFor(x => x.PaiementMethod, "Cash", new  id = "paiement_cash" )

    <label for="paiement_cc">Credit card</label>
    @Html.RadioButtonFor(x => x.PaiementMethod, "CreditCard", new  id = "paiement_cc" )

    <input type="submit" value="OK" />

如果您想要一些更通用的解决方案,将其封装在帮助程序中,您可能会发现 following answer 很有帮助。

【讨论】:

谢谢达林。但我的要求是绑定数据库值中的单选按钮并将文本/值对分配给单选按钮,以便将其分配给模型的属性。 完美!一直在找这个 不错的答案,节省了一个小时 ;)【参考方案2】:

这就是我喜欢绑定 RadioButtonLists 的方式。视图模型具有我的强类型对象的集合。例如,PaymentOptions 可能是一个代码表。与集合一起是 SelectedPaymentOptionKey(或 Selected*Id,如果您在主键前加上 Id)。最初此键将默认为 0,但在回发时,它将保存所选项目的值。

public class PaymentSelectionVM

  public ICollection<PaymentOption> PaymentOptions  get; set; 
  public int SelectedPaymentOptionKey  get; set; 


public ViewResult PaymentSelection()

  var paymentOptions = db.PaymentOptions.ToList();
  return View(
    new PaymentSelectionVM  
      PaymentOptions = paymentOptions,

      //This is not required, but shows how to default the selected radiobutton
      //Perhaps you have a relationship between a Customer and PaymentOption already,
      //SelectedPaymentOptionKey = someCustomer.LastPaymentOptionUsed.PaymentOptionKey
      //  or maybe just grab the first one(note this would NullReferenceException on empty collection)
      //SelectedPaymentOptionKey = paymentOptions.FirstOrDefault().PaymentOptionKey 
    );
 

然后在视图中:

@foreach (var opt in Model.PaymentOptions)
          
  @*Any other HTML here that you want for displaying labels or styling*@
  @Html.RadioButtonFor(m => m.SelectedPaymentOptionKey, opt.PaymentOptionKey)

m.SelectedPaymentOptionKey 有两个用途。首先,它将单选按钮组合在一起,以便选择是互斥的(我鼓励您使用 FireBug 之类的东西来检查生成的 html 只是为了您自己的理解。关于 MVC 的奇妙之处在于生成的 HTML 相当基本和标准所以你最终能够预测你的观点的行为应该不难。这里几乎没有魔法。)。其次,它将在回发时保存所选项目的值。

最后在 post 处理程序中,我们有可用的 SelectedPaymentOptionKey:

[HttpPost]
public ActionResult PaymentSelection(PaymentSelectionVM vm)

   currentOrder.PaymentOption = db.PaymentOptions.Find(vm.SelectedPaymentOptionKey);
   ....

与使用 SelectListItems 相比,它的优点是在显示网格/表格并需要显示对象的许多值的情况下,您可以访问更多对象的属性。我也喜欢 Html 助手中没有像其他一些方法那样传递硬编码字符串。

缺点是您会得到所有具有相同 ID 的单选按钮,这并不是一个好习惯。通过更改为以下内容可以轻松解决此问题:

  @Html.RadioButtonFor(m => m.SelectedPaymentOptionKey, opt.PaymentOptionKey, new  id = "PaymentOptions_" + opt.PaymentOptionKey)

最后,对于我见过的大多数单选按钮技术,验证有点古怪。如果我真的需要它,我会在单击单选按钮时连接一些 jquery 来填充隐藏的 SelectedPaymentOptionsKey,并将 [Required] 或其他验证放在隐藏字段上。

验证问题的另一种解决方法 ASP.NET MVC 3 unobtrusive validation and radio buttons

这看起来很有希望,但我还没有机会测试它: http://memoriesdotnet.blogspot.com/2011/11/mvc-3-radiobuttonlist-including.html

【讨论】:

【参考方案3】:

您应该将您的选项绑定到 ViewModel 中的 SelectList,并将先前选择的选项的 Selected 属性设置为 true

【讨论】:

以上是关于强类型 RadioButtonlist的主要内容,如果未能解决你的问题,请参考以下文章

JSONObject能不能强转成String类型?

强类型和弱类型

弱类型语言强类型语言?

PowerBuilder里String类型怎么强转成Time类型还有Int类型

弱类型语言与强类型语言

弱类型语言和强类型语言