web-dev-qa-db-fra.com

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

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 à Brian pour la direction mais c'était le contraire de ce qu'il a écrit. Comme si -

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

Le deuxième paramètre est sélectionné, utilisez donc le caractère! pour sélectionner la valeur non lorsque le booléen est faux.

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

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
194
Ben Cull

Voici un exemple plus complet utilisant fieldset pour des raisons d'accessibilité et spécifiant le premier bouton comme bouton par défaut. Sans un fieldset, il est impossible de déterminer par programme ce que sont les boutons radio.

Modèle

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

Voir

<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 @checked argument à l’objet anonyme pour définir le bouton radio comme valeur par défaut:

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

Notez que vous pouvez vous lier à une chaîne en remplaçant true et false par les valeurs de chaîne.

53
Daniel Imms

En me basant légèrement sur la réponse de Ben, j'ai ajouté des attributs pour l'ID afin de pouvoir 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.

26
ctc

L'ajout de balises d'étiquette autour des boutons radio à l'aide de HTML normal résoudra également le problème 'labelfor':

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

Cliquez sur le texte pour sélectionner le bouton radio approprié.

23
Jeff Bobish

ou MVC 2.0:

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

Si je peux me mettre à l’affût, je pense qu’il existe un moyen plus simple 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é à travers un réutilisable template de l'éditeur :

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:

  • Apprenez à écrire du HTML dans un éditeur HTML au lieu d’ajouter des chaînes dans le code suivant.
  • Conserve la DisplayName DataAnnotation
  • Permet de cliquer sur l'étiquette pour activer le bouton radio
  • Code le moins possible à conserver en forme (1 ligne). Si quelque chose ne va pas avec la façon dont il est rendu, prenez-le avec le modèle.
5
KyleMit

J'ai fini par intégrer cela dans une méthode d'extension afin (1) de générer l'étiquette et la radio en même temps et (2) pour ne pas avoir à 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")
1
attack