web-dev-qa-db-fra.com

Plusieurs groupes de boutons radio dans MVC 4 Razor

J'ai besoin de plusieurs groupes de boutons radio dans mon formulaire, comme ceci:
enter image description here

Je sais que cela se fait simplement en spécifiant le même attribut HTML "name" pour chaque groupe.
TOUTEFOIS
MVC ne vous permet pas de spécifier votre propre attribut de nom lors de l’utilisation de l’aide HTML 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 ne fonctionnait pas non plus.

Alors, y a-t-il un moyen qui fonctionne?

MODIFIER:
Voici mon point de vue (simplifié):

@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 une List de OptItems à l'intérieur:

public class OptServices
{
//a few things
public List<OptItems> Items {get; set;}
}
35
Ali

Ok voici comment j'ai résolu ça

Mon modèle est une list de catégories . Chaque catégorie contient une list de ses sous-catégories .
Dans cet esprit, chaque RadioButton aura à chaque fois dans la boucle foreach l'identifiant de sa catégorie (unique) comme attribut name.
Et j'ai aussi utilisé Html.RadioButton au lieu de Html.RadioButtonFor.

Voici le pseudo-code "fonctionnel" final:

@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 tous 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 problème;)

18
Ali

tout ce dont vous avez besoin est d’attacher le groupe à un article 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")
28
Matt Bodily

J'ai corrigé un problème similaire lors de la création d'un RadioButtonFor avec des paires de texte/valeur à partir d'une liste de sélection. J'ai utilisé un ViewBag pour envoyer la liste de sélection à la vue, mais vous pouvez également utiliser les données du modèle. Mon application Web est un blog et je dois créer un RadioButton avec certains types d'articles lorsqu'il écrit un nouveau message.

Le code ci-dessous a été simplement vérifié.

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 View, j'ai utilisé un foreach pour créer 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 pour intercepter l’option value sélectionnée par l’utilisateur, dans le Controler, après avoir soumis le formulaire. Je devais également mettre l'élément.Text en dehors de RadioButtonFor afin d'afficher les options text.

J'espère que c'est utile! 

2
Marcelo Sader

Vous pouvez utiliser Dictionnaire pour mapper Supposer que le lait, le beurre, le fromage sont le groupe A (ListA) L'eau, la bière et le vin sont le groupe B 

Dictonary<string,List<string>>) dataMap;
dataMap.add("A",ListA);
dataMap.add("B",ListB);

Dans View, vous pouvez foreach Keys dans dataMap et traiter votre action.

0
Dakota

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 identifiants uniques? Je réfléchis toujours à la question de savoir si je devrais utiliser un modèle d'éditeur, comme indiqué dans les liens d'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
Anna