Đây là cách tôi thích để ràng buộc RadioButtonLists. Mô hình khung nhìn có một bộ sưu tập các đối tượng được đánh máy mạnh mẽ của tôi. Ví dụ, có thể PaymentOptions là một bảng mã. Cùng với bộ sưu tập là một SelectedPaymentOptionKey (hoặc Selected * Id nếu bạn tiền tố khóa chính của bạn với Id). Ban đầu phím này sẽ được mặc định là 0, nhưng khi postback, nó sẽ giữ giá trị của mục đã chọn.
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
});
}
Sau đó, trong Xem:
@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)
}
Các m.SelectedPaymentOptionKey phục vụ hai mục đích. Đầu tiên, nó nhóm các nút Radio với nhau để lựa chọn là loại trừ lẫn nhau (tôi sẽ khuyến khích bạn sử dụng một cái gì đó như FireBug để kiểm tra html được tạo ra chỉ để hiểu biết của bạn. Điều tuyệt vời về MVC là HTML được tạo ra khá cơ bản và tiêu chuẩn vì vậy nó không khó cho bạn để có thể dự đoán được hành vi của quan điểm của bạn. Có rất ít ma thuật xảy ra ở đây.). Thứ hai, nó sẽ giữ giá trị của mục được chọn trên postback.
Và cuối cùng trong bài handler chúng ta có SelectedPaymentOptionKey sẵn:
[HttpPost]
public ActionResult PaymentSelection(PaymentSelectionVM vm)
{
currentOrder.PaymentOption = db.PaymentOptions.Find(vm.SelectedPaymentOptionKey);
....
}
Ưu điểm của việc này qua sử dụng SelectListItems là bạn phải truy cập vào nhiều tài sản của đối tượng trong trường hợp bạn đang hiển thị một lưới/và cần hiển thị nhiều giá trị của đối tượng. Tôi cũng thích rằng không có chuỗi mã hóa cứng nào được truyền trong các trình trợ giúp Html như một số cách tiếp cận khác có.
Điểm bất lợi là bạn nhận được các nút radio mà tất cả đều có cùng một ID, đó không thực sự là một thực hành tốt. Điều này có thể dễ dàng được khắc phục bằng cách thay đổi điều này:
@Html.RadioButtonFor(m => m.SelectedPaymentOptionKey, opt.PaymentOptionKey, new { id = "PaymentOptions_" + opt.PaymentOptionKey})
Cuối cùng, xác thực là một chút kỳ quặc với hầu hết các kỹ thuật nút radio tôi đã xem. Nếu tôi thực sự cần nó, tôi sẽ dây một số jquery lên để cư một SelectedPaymentOptionsKey ẩn bất cứ khi nào các nút radio được nhấp vào, và đặt [Required]
hoặc xác nhận khác trên trường ẩn.
Một cách giải quyết cho vấn đề xác nhận ASP.NET MVC 3 unobtrusive validation and radio buttons
này sẽ hứa hẹn nhưng tôi đã không có cơ hội để thử nghiệm nó: http://memoriesdotnet.blogspot.com/2011/11/mvc-3-radiobuttonlist-including.html
Có một helper html trên blog của tôi có thể giúp http://jonlanceley.blogspot.com/2011/06/mvc3-radiobuttonlist-helper.html – Jon