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

Est-ce que quelqu’un sait 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

  
Yes No

Merci

SOLUTION:

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

  
Yes No

Le deuxième paramètre est sélectionné, utilisez donc le! pour sélectionner la valeur no 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 un fieldset pour des raisons d’accessibilité et en spécifiant le premier bouton par défaut. Sans fieldset , ce à quoi fieldset les boutons radio dans leur ensemble ne peut pas être déterminé par programmation.

Modèle

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

Vue

 
Married @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")

Vous pouvez append un argument @checked à l’object 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 écartant légèrement la réponse de Ben, j’ai ajouté des atsortingbuts pour l’identifiant 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.

L’ajout de balises d’étiquette autour des boutons radio à l’aide du code HTML normal corrigera également le problème de «labelfor»:

   

En cliquant sur le texte, vous sélectionnez maintenant 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 jeter mon chapeau sur le ring, je pense qu’il existe un moyen plus propre que les réponses existantes pour réutiliser la fonctionnalité des boutons radio.

Disons que vous avez la propriété suivante dans votre ViewModel :

 Public Class ViewModel  Public Property LikesCats As Boolean End Class 

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

Tout d’abord, créez le fichier Views/Shared/EditorTemplates/YesNoRadio.vbhtml

Ajoutez ensuite le code suivant à YesNoRadio.vbhtml :

 @ModelType Boolean? 
@Html.LabelFor(Function(model) model)

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 code HTML dans un éditeur HTML au lieu d’append des chaînes de code derrière.
  • Préserve le DisplayName DataAnnotation
  • Permet de cliquer sur Étiquette pour activer le bouton radio
  • Code le moins possible à maintenir dans la forme (1 ligne). Si quelque chose ne va pas avec le rendu, reprenez-le avec le modèle.

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

 public static class HtmlHelperExtensions { public static MvcHtmlSsortingng RadioButtonAndLabelFor(this HtmlHelper self, Expression> expression, bool value, ssortingng labelText) { // Resortingeve the qualified model identifier ssortingng name = ExpressionHelper.GetExpressionText(expression); ssortingng fullName = self.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name); // Generate the base ID TagBuilder tagBuilder = new TagBuilder("input"); tagBuilder.GenerateId(fullName); ssortingng idAttr = tagBuilder.Atsortingbutes["id"]; // Create an ID specific to the boolean direction idAttr = Ssortingng.Format("{0}_{1}", idAttr, value); // Create the individual HTML elements, using the generated ID MvcHtmlSsortingng radioButton = self.RadioButtonFor(expression, value, new { id = idAttr }); MvcHtmlSsortingng label = self.Label(idAttr, labelText); return new MvcHtmlSsortingng(radioButton.ToHtmlSsortingng() + label.ToHtmlSsortingng()); } } 

Usage:

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