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:
entrez la description de l'image ici

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;}
}
33
demandé sur ekad 2014-03-04 18:19:14

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")
27
répondu Matt Bodily 2014-03-04 14:26:49

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 ;)

17
répondu Ali 2016-12-06 21:01:54

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!

2
répondu Marcelo Sader 2014-12-30 17:45:11

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

0
répondu Dakota 2014-03-04 15:37:44

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
0
répondu Anna 2018-07-11 16:51:43