2010-01-27 4 views

Répondre

2

Pourquoi ne pas utiliser Html.CheckBox()?

+0

Techniquement, vous ne pouvez pas produire de valeurs nulles avec une case à cocher. Si la sémantique de la situation nécessite une possibilité «je ne sais pas», alors vous avez besoin d'une autre méthode. Mais sinon, c'est la bonne façon de faire. Ou peut-être 'Html.CheckBox (x => x.Property)'. –

+1

@NickLarsen, Bien que je suis d'accord, le PO a spécifiquement posé des questions sur les bools. Et à moins que ce soit nullable (non déclaré), ce n'est pas un problème. –

2

Utilisez l'assistant DropDownListFor. Passez votre valeur booléenne et une liste de sélection contenant les valeurs que vous souhaitez mapper en booléen.

Model.MyBooleanList pourrait être un SelectList avec selectlistitems {("Oui", true); ("Non", false)} Model.MyBoolean est juste une valeur bool que vous voulez atteindre/mettre votre point de vue

<%= Html.DropDownListFor(m => m.MyBoolean, Model.MyBooleanList)%> 

HTH

13

Ceci est un vieux fil, mais encore au-dessus de quelques recherches.

Vous pouvez le faire en utilisant le construit en DropDownListFor HTML Helper:

<%= Html.DropDownListFor(model => Model.MyBooleanProperty,new List<SelectListItem>(){ new SelectListItem(){ Text = "Yes", Value="True"}, new SelectListItem(){ Text = "No", Value="False"}})%> 

Vous pouvez également implémenter votre propre HTML Helper:

public static MvcHtmlString BooleanDropdownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) 
    { 
     return BooleanDropdownListFor(htmlHelper, expression, null); 

    } 
    public static MvcHtmlString BooleanDropdownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, string EmptyText) 
    { 
     ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
     bool? value = null; 

     if (metadata != null && metadata.Model != null) 
     { 
      if (metadata.Model is bool) 
       value = (bool)metadata.Model; 
      else if (metadata.Model.GetType() == typeof(bool?)) 
       value = (bool?)metadata.Model; 
     } 

     List<SelectListItem> items = EmptyText != null ? 
      new List<SelectListItem>() { new SelectListItem() { Text = EmptyText, Value = "" }, new SelectListItem() { Text = "Yes", Value = "True", Selected = (value.HasValue && value.Value == true) }, new SelectListItem() { Text = "No", Value = "False", Selected = (value.HasValue && value.Value == false) } } : 
      new List<SelectListItem>() {new SelectListItem() { Text = "Yes", Value = "True", Selected = (value.HasValue && value.Value == true) }, new SelectListItem() { Text = "No", Value = "False", Selected = (value.HasValue && value.Value == false) } }; 

     return htmlHelper.DropDownListFor(expression, items); 
    } 

Je suggère d'utiliser une propriété nullable bool sur votre vue Modèle pour que la liste déroulante ne soit pas par défaut "faux" ou "vrai". Vous pouvez facilement baliser le viewmodel avec l'attribut Required qui serait handel si aucune option n'était sélectionnée.

0

J'ai ceci:

public static class BoolUtility 
{ 
    public static IEnumerable<SelectListItem> SelectList(string defaultText = null, string defaultTrue = "True", string defaultFalse = "False") 
    { 
     var list = new List<SelectListItem> 
     { 
      new SelectListItem {Text = defaultTrue, Value = "True"}, 
      new SelectListItem {Text = defaultFalse, Value = "False"} 
     }; 

     if (defaultText != null) 
     { 
      list.Insert(0, new SelectListItem 
      { 
       Text = defaultText, 
       Value = string.Empty 
      }); 
     } 

     return list; 
    } 
} 

Et l'utiliser comme ceci:

@Html.DropDownListFor(m => m.SomeBoolProperty, BoolUtility.SelectList("All", "Yes", "No")) 

Et il semble bien fonctionner. Assez flexible, puisque vous pouvez contrôler toutes les étiquettes, et si oui ou non il y a une valeur 'par défaut'.

Oh, et quelques tests unitaires NUnit, si vous voulez. Pas exhaustive, mais ce n'est pas si compliqué que ça ...

[TestFixture] 
class BoolUtilityTests 
{ 
    [Test] 
    public void Parameterless() 
    { 
     var actual = BoolUtility.SelectList().ToList(); 
     Assert.That(actual.Count, Is.EqualTo(2)); 
     Assert.That(actual.First().Text, Is.EqualTo("True")); 
     Assert.That(actual.First().Value, Is.EqualTo("True")); 
     Assert.That(actual.Last().Text, Is.EqualTo("False")); 
     Assert.That(actual.Last().Value, Is.EqualTo("False")); 
    } 

    [Test] 
    public void LabelOverrides() 
    { 
     var actual = BoolUtility.SelectList(defaultTrue: "Yes", defaultFalse: "No").ToList(); 
     Assert.That(actual.Count, Is.EqualTo(2)); 
     Assert.That(actual.First().Text, Is.EqualTo("Yes")); 
     Assert.That(actual.First().Value, Is.EqualTo("True")); 
     Assert.That(actual.Last().Text, Is.EqualTo("No")); 
     Assert.That(actual.Last().Value, Is.EqualTo("False")); 
    } 

    [Test] 
    public void IncludeDefaultOption() 
    { 
     var actual = BoolUtility.SelectList(defaultText: "all").ToList(); 
     Assert.That(actual.Count, Is.EqualTo(3)); 
     Assert.That(actual.First().Text, Is.EqualTo("all")); 
     Assert.That(actual.First().Value, Is.EqualTo(string.Empty)); 
    } 
} 
0

si vous voulez capturer OUI, NON et NotSet (pas de réponse) Les valeurs un peu je vous suggère d'utiliser une liste déroulante comme celui-ci

Public Class MyModelClass 
{ 
    [Display(Name = "Project Based Subsidy?")] 
    public Nullable<bool> IsSubsidyProjectBased{ get; set; } 

    public SelectList DropDownItems 
    { 
     get 
     { 
      List<DropDownItems> ddItem = new List<DropDownItems>(); 
      ddItem.Add(new DropDownItems("--Select--", null)); 
      ddItem.Add(new DropDownItems("Yes", true)); 
      ddItem.Add(new DropDownItems("No", false));     
      return new SelectList(ddItem, "Value", "Text"); 
     } 
    } 

public class DropDownItems 
{ 
    public DropDownItems(string text, bool? value) 
    { 
     this.Text = text; 
     this.Value = value; 
    } 
    public string Text { get; set; } 
    public bool? Value { get; set; } 
} 

} 

Ensuite, dans votre vue, vous pouvez simplement avoir

@Html.DropDownListFor(model => model.IsSubsidyProjectBased, Model.DropDownItems) 
Questions connexes