Ao usar o .net MVC RadioButtonFor (), como você agrupa apenas uma seleção pode ser feita?

Este tem me perplexo, eu tenho uma visão fortemente tipada que tem esse loop para gerar radiobuttons:

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

Ele renderiza bem, mas como os nomes não são os mesmos, você pode selecionar mais de um radiobutton. Como posso agrupá-los para que apenas um radiobutton possa ser selecionado?

Qualquer ajuda seria apreciada!

O primeiro parâmetro de Html.RadioButtonFor () deve ser o nome da propriedade que você está usando, e o segundo parâmetro deve ser o valor desse botão de opção específico. Em seguida, eles terão o mesmo valor de atributo de nome e o auxiliar selecionará o botão de opção fornecido quando / se corresponder ao valor da propriedade.

Exemplo:

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

Aqui está um exemplo mais específico:

Eu fiz um projeto MVC rápido chamado “DeleteMeQuestion” (prefixo DeleteMe, então eu sei que posso removê-lo depois que eu esquecer).

Eu fiz o seguinte 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; } } } 

Há um validador de intervalo simples no modelo, apenas por diversão. Em seguida, fiz o seguinte 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, fiz a seguinte visão que faz uso do 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) %>
<% } %>

Pelo que entendi seu contexto, você tem perguntas com uma lista de respostas disponíveis. Cada resposta ditará a próxima pergunta. Espero que isso faça sentido a partir do meu modelo e dos comentários TODO.

Isso fornece os botões de opção com o mesmo atributo de nome, mas atributos de ID diferentes.

No meu caso, eu tinha uma coleção de botões de rádio que precisavam estar em um grupo. Acabei de include uma propriedade ‘Selected’ no modelo. Então, no loop de saída dos radiobuttons, basta fazer …

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

Desta forma, o nome é o mesmo para todos os botões de opção. Quando o formulário é publicado, a propriedade ‘Selected’ é igual ao título da categoria (ou id ou qualquer outro) e isso pode ser usado para atualizar a binding no botão de opção relevante, assim …

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

Pode não ser o melhor caminho, mas funciona.

Nos casos em que o atributo name é diferente, é mais fácil controlar o grupo de rádio via JQuery. Quando uma opção é selecionada, use o JQuery para desmarcar as outras opções.