强类型 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的主要内容,如果未能解决你的问题,请参考以下文章