Plusieurs groupes de boutons radio dans MVC 4 Razor
J'ai besoin d'avoir plusieurs des groupes de boutons radio dans mon formulaire comme ceci:
Je sais que c'est simplement fait en spécifiant le même attribut html "name" pour chaque groupe.
CEPENDANT
MVC ne vous permet pas de spécifier votre propre attribut name lors de l'utilisation de html helper comme ceci:
@Html.RadioButtonFor(i => item.id, item.SelectedID, new { Name = item.OptServiceCatId })
Parce que Il regarde l'attribut "name" de chaque balise (pas "id") pour mapper / lier le formulaire au modèle que le contrôleur reçoit, etc.
Certains ont dit que spécifier chacun avec le même attribut "GroupName" résoudrait le problème, mais cela n'a pas fonctionné non plus.
Alors, y a-t-il un moyen qui fonctionne ?
Modifier:
Voici ma vue (simplifiée):
@model Service_Provider.ViewModels.SelectOptServicesForSubServiceViewModel
@foreach (var cat in Model.OptServices)
{
//A piece of code & html here
@foreach (var item in cat.OptItems.Where(i => i.MultiSelect == false))
{
@Html.RadioButtonFor(i => item.id, item.SelectedID, new { GroupName = item.OptServiceCatId })
<br />
}
}
REMARQUE:
Mon modèle est un List<OptServices>
:
public List<OptServices> Cats {get; set;}
Et OptServices a un List
de OptItems
à l'intérieur:
public class OptServices
{
//a few things
public List<OptItems> Items {get; set;}
}
5 réponses
Tout ce dont vous avez besoin est de lier le groupe à un élément différent de votre modèle
@Html.RadioButtonFor(x => x.Field1, "Milk")
@Html.RadioButtonFor(x => x.Field1, "Butter")
@Html.RadioButtonFor(x => x.Field2, "Water")
@Html.RadioButtonFor(x => x.Field2, "Beer")
Ok, voici comment j'ai corrigé cela
Mon modèle est un list
de catégories. Chaque catégorie contient un list
de ses sous-catégories .
dans cet esprit, à chaque fois dans la boucle foreach, chaque RadioButton
aura son ID de catégorie (qui est unique) comme son Nom attribut.
Et j'ai aussi utilisé Html.RadioButton
au lieu de Html.RadioButtonFor
.
Voici le pseudo-code final 'de travail':
@foreach (var cat in Model.Categories)
{
//A piece of code & html here
@foreach (var item in cat.SubCategories)
{
@Html.RadioButton(item.CategoryID.ToString(), item.ID)
}
}
Le résultat est:
<input name="127" type="radio" value="110">
Veuillez noter que je n'ai pas mis toutes ces groupes de boutons radio dans un formulaire. Et je ne sais pas si cette solution fonctionnera toujours correctement sous une forme.
Merci à toutes les personnes qui m'ont aidé à résoudre ce ;)
J'ai corrigé un problème similaire en construisant un RadioButtonFor avec des paires de texte / Valeur à partir d'une SelectList. J'ai utilisé un ViewBag pour envoyer la SelectList à la vue, mais vous pouvez également utiliser les données du modèle. Mon application web est un Blog et je dois construire un RadioButton avec certains types d'articles quand il écrit un nouveau post.
Le code ci-dessous a été simplyfied.
List<SelectListItem> items = new List<SelectListItem>();
Dictionary<string, string> dictionary = new Dictionary<string, string>();
dictionary.Add("Texto", "1");
dictionary.Add("Foto", "2");
dictionary.Add("Vídeo", "3");
foreach (KeyValuePair<string, string> pair in objBLL.GetTiposPost())
{
items.Add(new SelectListItem() { Text = pair.Key, Value = pair.Value, Selected = false });
}
ViewBag.TiposPost = new SelectList(items, "Value", "Text");
Dans la vue, j'ai utilisé un foreach pour construire un radiobutton.
<div class="form-group">
<div class="col-sm-10">
@foreach (var item in (SelectList)ViewBag.TiposPost)
{
@Html.RadioButtonFor(model => model.IDTipoPost, item.Value, false)
<label class="control-label">@item.Text</label>
}
</div>
</div>
Notez que j'ai utilisé RadioButtonFor dans afin d'attraper l'option valeur sélectionné par l'utilisateur, dans le Contrôleur, après la soumission du formulaire. J'ai également eu à mettre de l'élément.Texte en dehors du RadioButtonFor afin d'afficher les optionstext .
J'espère que c'est utile!
Vous pouvez utiliser Dictonary pour mapper Supposons que le lait, le beurre, le Chesse soient du groupe a (ListA) L'eau, la bière, le vin sont le groupe B
Dictonary<string,List<string>>) dataMap;
dataMap.add("A",ListA);
dataMap.add("B",ListB);
À la vue, vous pouvez foreach clés dans dataMap et traiter votre action
J'ai pu utiliser l'attribut name que vous avez décrit dans votre exemple pour la boucle sur laquelle je travaille et cela a fonctionné, peut-être parce que j'ai créé des id uniques? Je considère toujours si je devrais passer à un modèle d'éditeur à la place comme mentionné dans les liens dans une autre réponse.
@Html.RadioButtonFor(modelItem => item.Answers.AnswerYesNo, "true", new {Name = item.Description.QuestionId, id = string.Format("CBY{0}", item.Description.QuestionId), onclick = "setDescriptionVisibility(this)" }) Yes
@Html.RadioButtonFor(modelItem => item.Answers.AnswerYesNo, "false", new { Name = item.Description.QuestionId, id = string.Format("CBN{0}", item.Description.QuestionId), onclick = "setDescriptionVisibility(this)" } ) No