web-dev-qa-db-fra.com

Convertir un éditeur de propriétés booléennes en liste déroulante en vue MVC

J'ai actuellement échafaudé une vue où une propriété booléenne de mon modèle est passée à l'assistant Html.EditorFor:

@Html.EditorFor(model => model.EndCurrentDeal)

Très bien, mais ce que je cherche vraiment à faire, c'est de masser cela dans une liste déroulante comme:

<select>
    <option value="true" selected="selected">Yes</option>
    <option value="false">No</option>
</select>

Quelle est la manière la plus simple d'y parvenir?

Merci,

Chris

24
Mister Epic

Vous pouvez essayer quelque chose comme ici :

<%= Html.DropDownList(
    "", 
    new SelectList(
        new[] 
        { 
            new { Value = "true", Text = "Yes" },
            new { Value = "false", Text = "No" },
        }, 
        "Value", 
        "Text",
        Model
    )
) %>

Si vous souhaitez une valeur par défaut:

<%= Html.DropDownList(
        "", 
        new SelectList(
            new[] 
            { 
                new { Value = "", Text = "None" },
                new { Value = "true", Text = "Yes" },
                new { Value = "false", Text = "No" },
            }, 
            "Value", 
            "Text",
            Model
        )
    ) %>
24
Francois Borgies

MVC 4

@*/////////////////// bool ////////////////////////////////*@
@model bool

@Html.DropDownListFor(m => m, new SelectList(
        new[] 
        { 
            new { Value = "true", Text = "Yes" },
            new { Value = "false", Text = "No" },
        },
        "Value",
        "Text",
        Model
    ))

@*/////////////////// bool? ////////////////////////////////*@    
@model bool?

@Html.DropDownListFor(m => m, new SelectList(
        new[] 
        { 
            new { Value = "", Text = "(none)" },
            new { Value = "true", Text = "Yes" },
            new { Value = "false", Text = "No" },
        },
        "Value",
        "Text",
        Model
    ))
22
Serge

Vous pouvez également essayer l'approche Dictionnaire est un peu plus propre et peut être facilement ajoutée à votre constructeur pour View Model.

ViewModel

 //Define IDictionary interface
 public IDictionary<bool, string> options { get; set; }

public YourViewModel()
{
  // Default constructor
        this.options = new Dictionary<bool, string>();
        this.options.Add(false, "no");
        this.options.Add(true, "yes");
}




@Html.DropDownListFor(model => model.yourPropertyToEdit, new SelectList( Model.options, "Key", "Value"))
9
Adam Bielecki

Je me suis inspiré de la réponse très utile de François Borgies, j'ai donc décidé d'écrire une méthode personnalisée qui crée SelectList pour Valeur booléenne pouvant être utilisée dans @ Html.DropDownList . Lorsque vous avez une méthode d'assistance qui peut être utilisée dans chaque vue, elle réduit la quantité de code nécessaire dans les vues de rasoir.

Mon projet a la classe CustomHelpers.cs dans le dossier: App_Code/Helpers

namespace YourProjectName.App_Code.Helpers
{
    public static class CustomHelpers
    {
        public static SelectList SelectListForBoolean(object selectedValue = null)
        {
            SelectListItem[] selectListItems = new SelectListItem[2];

            var itemTrue = new SelectListItem();
            itemTrue.Value = "true";
            itemTrue.Text = "Yes";
            selectListItems[0] = itemTrue;

            var itemFalse = new SelectListItem();
            itemFalse.Value = "false";
            itemFalse.Text = "No";
            selectListItems[1] = itemFalse;

            var selectList = new SelectList(selectListItems, "Value","Text", selectedValue);

            return selectList;
        }           
    }
}

Dans la vue create, vous pouvez l'utiliser comme suit:

@model Foo
@using YourProjectName.App_Code.Helpers;
...
@Html.DropDownList("EndCurrentDeal", CustomHelpers.SelectListForBoolean(), "-select-")

pour modifier voir

@model Bar
@using YourProjectName.App_Code.Helpers;
...
@Html.DropDownList("EndCurrentDeal", CustomHelpers.SelectListForBoolean(Model.EndCurrentDeal), "-select-")

Bien que ma méthode d'assistance ne soit pas pure HTML Helper car elle crée SelectList , - elle suit néanmoins la même fonctionnalité que celle présentée par Rahul Rajat Singh, dans son excellent article n tutoriel absolu pour débutants sur les assistants HTML et la création d'assistants HTML personnalisés dans ASP.NET MVC

5
jyrkim