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>
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
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
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.
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.
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é.
ou MVC 2.0:
<%= Html.RadioButtonFor(model => model.blah, true) %> Yes
<%= Html.RadioButtonFor(model => model.blah, false) %> No
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:
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")