Esto es lo que me gusta de unirse RadioButtonLists. El modelo de vista tiene una colección de mis objetos fuertemente tipados. Por ejemplo, tal vez PaymentOptions es una tabla de códigos. Junto con la colección hay SelectedPaymentOptionKey (o Selected * Id si prefieres tus claves principales con Id). Inicialmente, esta clave será predeterminada 0, pero en la devolución de datos, mantendrá el valor del elemento seleccionado.
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
});
}
A continuación, en la vista:
@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)
}
El m.SelectedPaymentOptionKey tiene dos propósitos. Primero, agrupa los botones de Radio juntos para que la selección sea mutuamente exclusiva (lo animo a usar algo como FireBug para inspeccionar el html generado solo para su propio entendimiento. Lo maravilloso de MVC es que el HTML generado es bastante básico y estándar por lo que no debería ser difícil para usted poder predecir el comportamiento de sus puntos de vista. Aquí hay muy poca magia). En segundo lugar, mantendrá el valor del elemento seleccionado en la devolución de datos.
Y finalmente en el controlador puesto que tienen la SelectedPaymentOptionKey disponibles:
[HttpPost]
public ActionResult PaymentSelection(PaymentSelectionVM vm)
{
currentOrder.PaymentOption = db.PaymentOptions.Find(vm.SelectedPaymentOptionKey);
....
}
La ventaja de este sobre el uso de SelectListItems es que tienes acceso a más de las propiedades del objeto en el caso de que se está mostrando una cuadrícula/tabla y necesita mostrar muchos valores del objeto. También me gusta que no se hayan pasado cadenas codificadas en los helpers Html como lo han hecho otros enfoques.
La desventaja es que obtienes botones de opción que tienen la misma identificación, lo cual no es una buena práctica. Esto se puede arreglar fácilmente cambiando a esto:
@Html.RadioButtonFor(m => m.SelectedPaymentOptionKey, opt.PaymentOptionKey, new { id = "PaymentOptions_" + opt.PaymentOptionKey})
Por último, la validación es un poco peculiar con la mayoría de todas las técnicas de botón de radio que he visto. Si realmente lo necesitara, conectaría algunos jquery para rellenar una SelectedPaymentOptionsKey oculta cada vez que se haga clic en los botones de opción, y colocaré el [Required]
u otra validación en el campo oculto.
Otra solución para el problema de validación ASP.NET MVC 3 unobtrusive validation and radio buttons
Esto parece prometedor, pero no he tenido la oportunidad de probarlo: http://memoriesdotnet.blogspot.com/2011/11/mvc-3-radiobuttonlist-including.html
Hay una ayuda HTML en mi blog que puede ayudar a http://jonlanceley.blogspot.com/2011/06/mvc3-radiobuttonlist-helper.html – Jon