Al usar .net MVC RadioButtonFor (), ¿cómo se agrupa para que solo se pueda hacer una selección?

Este me tiene perplejo, tengo una vista fuertemente tipada que tiene este ciclo para generar botones de radio:

  model.QuestionAnswers[(int)qa.QuestionID - 1].AnswerValue, "Checked" ) %>   

Se procesa bien, pero dado que los nombres no son lo mismo, puede seleccionar más de 1 radiobutton. ¿Cómo puedo agruparlos para que solo se pueda seleccionar 1 radiobutton?

¡Cualquier ayuda sería apreciada!

El primer parámetro de Html.RadioButtonFor () debe ser el nombre de propiedad que está utilizando, y el segundo parámetro debe ser el valor de ese botón de opción específico. Entonces tendrán el mismo valor de atributo de nombre y el ayudante seleccionará el botón de opción dado cuando / si coincide con el valor de la propiedad.

Ejemplo:

 
< %= Html.RadioButtonFor(m => m.Gender, "M" ) %> Male < %= Html.RadioButtonFor(m => m.Gender, "F" ) %> Female

Aquí hay un ejemplo más específico:

Hice un proyecto MVC rápido llamado “DeleteMeQuestion” (prefijo DeleteMe, así que sé que puedo eliminarlo más tarde después de que lo olvide).

Hice el siguiente modelo:

 namespace DeleteMeQuestion.Models { public class QuizModel { public int ParentQuestionId { get; set; } public int QuestionId { get; set; } public string QuestionDisplayText { get; set; } public List Responses { get; set; } [Range(1,999, ErrorMessage = "Please choose a response.")] public int SelectedResponse { get; set; } } public class Response { public int ResponseId { get; set; } public int ChildQuestionId { get; set; } public string ResponseDisplayText { get; set; } } } 

Hay un validador de rango simple en el modelo, solo por diversión. A continuación, hice el siguiente controlador:

 namespace DeleteMeQuestion.Controllers { [HandleError] public class HomeController : Controller { public ActionResult Index(int? id) { // TODO: get question to show based on method parameter var model = GetModel(id); return View(model); } [HttpPost] public ActionResult Index(int? id, QuizModel model) { if (!ModelState.IsValid) { var freshModel = GetModel(id); return View(freshModel); } // TODO: save selected answer in database // TODO: get next question based on selected answer (hard coded to 999 for now) var nextQuestionId = 999; return RedirectToAction("Index", "Home", new {id = nextQuestionId}); } private QuizModel GetModel(int? questionId) { // just a stub, in lieu of a database var model = new QuizModel { QuestionDisplayText = questionId.HasValue ? "And so on..." : "What is your favorite color?", QuestionId = 1, Responses = new List { new Response { ChildQuestionId = 2, ResponseId = 1, ResponseDisplayText = "Red" }, new Response { ChildQuestionId = 3, ResponseId = 2, ResponseDisplayText = "Blue" }, new Response { ChildQuestionId = 4, ResponseId = 3, ResponseDisplayText = "Green" }, } }; return model; } } } 

Finalmente, hice la siguiente vista que hace uso del modelo:

 < %@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>  Home Page   < % using (Html.BeginForm()) { %> 

< %: Model.QuestionDisplayText %>

    < % foreach (var item in Model.Responses) { %>
  • < %= Html.RadioButtonFor(m => m.SelectedResponse, item.ResponseId, new {id="Response" + item.ResponseId}) %>
  • < % } %>
< %= Html.ValidationMessageFor(m => m.SelectedResponse) %>
< % } %>

A medida que entiendo su contexto, tiene preguntas con una lista de respuestas disponibles. Cada respuesta dictará la siguiente pregunta. Espero que eso tenga sentido en mi modelo y en los comentarios TODO.

Esto le da los botones de opción con el mismo atributo de nombre, pero diferentes atributos de ID.

En mi caso, tenía una colección de botones de radio que necesitaba estar en un grupo. Acabo de incluir una propiedad ‘Seleccionado’ en el modelo. Luego, en el bucle para emitir los botones de radio, simplemente hazlo …

 @Html.RadioButtonFor(m => Model.Selected, Model.Categories[i].Title) 

De esta manera, el nombre es el mismo para todos los botones de opción. Cuando se publica el formulario, la propiedad ‘Seleccionado’ es igual al título de la categoría (o ID o lo que sea) y esto se puede usar para actualizar el enlace en el botón de radio relevante, como este …

 model.Categories.Find(m => m.Title.Equals(model.Selected)).Selected = true; 

Puede que no sea la mejor manera, pero funciona.

En los casos en que el atributo de nombre es diferente, es más fácil controlar el grupo de radio a través de JQuery. Cuando se selecciona una opción, use JQuery para deseleccionar las otras opciones.