Boutons radio Oui / Non ASP.NET MVC avec modèle MVC fortement lié

132

Quelqu'un sait-il comment lier un bouton radio Oui / Non à une propriété booléenne d'un modèle fortement typé dans ASP.NET MVC.

Modèle

public class MyClass
{
     public bool Blah { get; set; }
}

Vue

<%@  Page Title="blah"  Inherits="MyClass"%>
    <dd>
        <%= Html.RadioButton("blah", Model.blah) %> Yes
        <%= Html.RadioButton("blah", Model.blah) %> No
    </dd>

Merci

SOLUTION:

Merci pour Brian pour la direction mais c'était le contraire de ce qu'il a écrit. Comme tel -

<%@  Page Title="blah"  Inherits="MyClass"%>
<dd>
    <%= Html.RadioButton("blah", !Model.blah) %> Yes
    <%= Html.RadioButton("blah", Model.blah) %> No
</dd>
Brianstewey
la source
4
Le "problème" avec ces solutions (et j'utilise le style Ben Cull dans mon projet) est que vous ne pouvez pas faire d'étiquettes avec elles. Les deux entrées de bouton radio auront le même identifiant et le même nom, donc si vous utilisez Html.LabelFor, il sera lié à la première entrée de bouton radio dans le DOM avec cet identifiant. Comme je l'ai dit, j'utilise ces solutions pour que les boutons radio représentent un champ booléen, je voulais juste que les gens sachent que les étiquettes seront un peu bancales.
Gromer
2
Consultez la réponse de Jeff Bobish pour savoir comment résoudre le problème d'étiquette avec élégance.
René

Réponses:

74

Le deuxième paramètre est sélectionné, utilisez donc le! pour sélectionner la valeur no lorsque la valeur booléenne est false.

<%= Html.RadioButton("blah", !Model.blah) %> Yes 
<%= Html.RadioButton("blah", Model.blah) %> No 
Brian Mains
la source
198

Si vous utilisez MVC 3 et Razor, vous pouvez également utiliser les éléments suivants:

@Html.RadioButtonFor(model => model.blah, true) Yes
@Html.RadioButtonFor(model => model.blah, false) No
Ben Cull
la source
56

Voici un exemple plus complet utilisant un fieldsetpour des raisons d'accessibilité et spécifiant le premier bouton par défaut. Sans a fieldset, à quoi servent les boutons radio dans leur ensemble ne peut pas être déterminé par programme.

Modèle

public class MyModel
{
    public bool IsMarried { get; set; }
}

Vue

<fieldset>
    <legend>Married</legend>

    @Html.RadioButtonFor(e => e.IsMarried, true, new { id = "married-true" })
    @Html.Label("married-true", "Yes")

    @Html.RadioButtonFor(e => e.IsMarried, false, new { id = "married-false" })
    @Html.Label("married-false", "No")
</fieldset>

Vous pouvez ajouter un @checkedargument à l'objet anonyme pour définir le bouton radio par défaut:

new { id = "married-true", @checked = 'checked' }

Notez que vous pouvez lier à une chaîne en remplaçant trueet falsepar les valeurs de chaîne.

Daniel Imms
la source
Vous devez en fait utiliser new {id = Html.Id ("Married-true")}, ce qui réduit les problèmes potentiels de portée des préfixes d'identifiants générés.
eoleary
26

En m'appuyant légèrement sur la réponse de Ben, j'ai ajouté des attributs pour l'ID afin que je puisse utiliser des étiquettes.

<%: Html.Label("isBlahYes", "Yes")%><%= Html.RadioButtonFor(model => model.blah, true, new { @id = "isBlahYes" })%>
<%: Html.Label("isBlahNo", "No")%><%= Html.RadioButtonFor(model => model.blah, false, new { @id = "isBlahNo" })%>

J'espère que ça aide.

ctc
la source
7
Normalement, l'étiquette est après un bouton radio.
Daniel Imms
6
Mettre une étiquette autour d'un bouton radio est parfaitement valable.
Scott Baker
23

L'ajout de balises d'étiquette autour des boutons radio en utilisant du HTML standard résoudra également le problème 'labelfor':

<label><%= Html.RadioButton("blah", !Model.blah) %> Yes</label>
<label><%= Html.RadioButton("blah", Model.blah) %> No</label>

Cliquer sur le texte sélectionne maintenant le bouton radio approprié.

Jeff Bobish
la source
8

ou MVC 2.0:

<%= Html.RadioButtonFor(model => model.blah, true) %> Yes
<%= Html.RadioButtonFor(model => model.blah, false) %> No
Stafford Williams
la source
5

Si je peux jeter mon chapeau dans le ring, je pense qu'il existe un moyen plus propre que les réponses existantes de réutiliser la fonctionnalité du bouton radio.

Supposons que vous ayez la propriété suivante dans votre ViewModel :

Public Class ViewModel
    <Display(Name:="Do you like Cats?")>
    Public Property LikesCats As Boolean
End Class

Vous pouvez exposer cette propriété via un modèle d'éditeur réutilisable :

Commencez par créer le fichier Views/Shared/EditorTemplates/YesNoRadio.vbhtml

Ajoutez ensuite le code suivant à YesNoRadio.vbhtml :

@ModelType Boolean?

<fieldset>
    <legend>
        @Html.LabelFor(Function(model) model)
    </legend>

    <label>
        @Html.RadioButtonFor(Function(model) model, True) Yes
    </label>
    <label>
        @Html.RadioButtonFor(Function(model) model, False) No
    </label>
</fieldset>

Vous pouvez appeler l'éditeur de la propriété en spécifiant manuellement le nom du modèle dans votre vue :

@Html.EditorFor(Function(model) model.LikesCats, "YesNoRadio")

Avantages:

  • Essayez d'écrire du HTML dans un éditeur HTML au lieu d'ajouter des chaînes dans le code derrière.
  • Préserve le DisplayName DataAnnotation
  • Permet aux clics sur l'étiquette de basculer le bouton radio
  • Le moins de code possible à maintenir en forme (1 ligne). Si quelque chose ne va pas dans la façon dont il est rendu, reprenez-le avec le modèle.
KyleMit
la source
C'est bien, mais qu'en est-il d'une troisième option pour Boolean? @ Html.RadioButtonFor (Function (Model) Model.IsVerified, True) <span> Oui </span> @ Html.RadioButtonFor (Function (Model) Model.IsVerified, False) <span> Non </span> @ Html.RadioButtonFor (Fonction (modèle) Model.IsVerified, Nothing)) <span> En attente </span>
JoshYates1980
1

J'ai fini par empaqueter ceci dans une méthode d'extension afin (1) que je puisse générer l'étiquette et la radio à la fois et (2) donc je n'ai pas eu à me soucier de spécifier mes propres identifiants:

public static class HtmlHelperExtensions
{
    public static MvcHtmlString RadioButtonAndLabelFor<TModel, TProperty>(this HtmlHelper<TModel> self, Expression<Func<TModel, TProperty>> expression, bool value, string labelText)
    {
        // Retrieve the qualified model identifier
        string name = ExpressionHelper.GetExpressionText(expression);
        string fullName = self.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);

        // Generate the base ID
        TagBuilder tagBuilder = new TagBuilder("input");
        tagBuilder.GenerateId(fullName);
        string idAttr = tagBuilder.Attributes["id"];

        // Create an ID specific to the boolean direction
        idAttr = String.Format("{0}_{1}", idAttr, value);

        // Create the individual HTML elements, using the generated ID
        MvcHtmlString radioButton = self.RadioButtonFor(expression, value, new { id = idAttr });
        MvcHtmlString label = self.Label(idAttr, labelText);

        return new MvcHtmlString(radioButton.ToHtmlString() + label.ToHtmlString());
    }
}

Usage:

@Html.RadioButtonAndLabelFor(m => m.IsMarried, true, "Yes, I am married")
attaque
la source