Вот как мне нравится связывать 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 довольно простой и стандартный поэтому вам не составит труда в конечном итоге предсказать поведение ваших представлений.Здесь очень мало магии.). Во-вторых, он будет хранить значение выбранного элемента при обратной передаче.
И, наконец, в обработчике сообщений у нас есть доступный SelectedPaymentOptionKey:
[HttpPost]
public ActionResult PaymentSelection(PaymentSelectionVM vm)
{
currentOrder.PaymentOption = db.PaymentOptions.Find(vm.SelectedPaymentOptionKey);
....
}
Преимущество этого перед использованием SelectListItems заключается в том, что у вас есть доступ к большему количеству свойств объекта в случае, если вы отображаете сетку/таблицу и вам нужно отобразить множество значений объекта. Мне также нравится, что в помощниках Html не передаются жестко закодированные строки, как в некоторых других подходах.
Недостатком является то, что вы получаете переключатели с одинаковым идентификатором, что на самом деле не очень хорошая практика. Это легко исправить, изменив на это:
@Html.RadioButtonFor(m => m.SelectedPaymentOptionKey, opt.PaymentOptionKey, new { id = "PaymentOptions_" + opt.PaymentOptionKey})
Наконец, проверка немного причудлива с большинством всех методов переключателей, которые я видел. Если бы мне это действительно было нужно, я бы подключил некоторый jquery для заполнения скрытого SelectedPaymentOptionsKey всякий раз, когда нажимаются переключатели, и помещал [Required]
или другую проверку в скрытое поле.
Другой обходной путь для проблемы проверки ненавязчивая проверка ASP.NET MVC 3 и переключатели
Это выглядит многообещающе, но у меня не было возможности проверить это: http://memoriesdotnet.blogspot.com/2011/11/mvc-3-radiobuttonlist-include.html
person
AaronLS
schedule
11.07.2012