web-dev-qa-db-fra.com

Liste déroulante ASP.NET MVC à partir de SelectList

Je construis le suivant SelectList dans mon contrôleur.

var u = new NewUser();

u.UserTypeOptions = new SelectList(new List<SelectListItem>
{
    new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"},
    new SelectListItem { Selected = false, Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()},
    new SelectListItem { Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()},
});

return u;

Et l'afficher sur ma vue comme ceci:

@Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions)

Il semble que je lui donne un ensemble valide de SelectListItems dans une liste déroulante qui devrait être assez simple, mais au lieu d’obtenir une liste <option> valide avec de bonnes valeurs et du texte, j’obtiens ceci:

<select data-val="true" data-val-range="A user type must be selected." data-val-range-max="2" data-val-range-min="1" data-val-required="The UserType field is required." id="UserType" name="UserType" class="input-validation-error">
    <option>System.Web.Mvc.SelectListItem</option>
    <option>System.Web.Mvc.SelectListItem</option>
    <option>System.Web.Mvc.SelectListItem</option>
</select>

Ce qui donne? Autant que je sache, cela devrait marcher.

41
MattW

Il vous manque de définir le champ Texte et Valeur dans la liste de sélection proprement dite. C'est pourquoi il fait .ToString() sur chaque objet de la liste. Vous pourriez penser que, étant donné qu'il s'agit d'une liste de SelectListItem, il devrait être assez intelligent pour le détecter ... mais ce n'est pas le cas.

_u.UserTypeOptions = new SelectList(
    new List<SelectListItem>
    {
        new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"},
        new SelectListItem { Selected = false, Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()},
        new SelectListItem { Selected = false, Text = "Contractor", Value = ((int)UserType.Contractor).ToString()},
    }, "Value" , "Text", 1);
_

BTW, vous pouvez utiliser une liste de tableaux de tous types ... et simplement définir le nom des propriétés qui agiront en tant que texte et valeur.

Je pense qu'il vaut mieux le faire comme ça:

_u.UserTypeOptions = new SelectList(
    new List<SelectListItem>
    {
        new SelectListItem { Text = "Homeowner", Value = ((int)UserType.Homeowner).ToString()},
        new SelectListItem { Text = "Contractor", Value = ((int)UserType.Contractor).ToString()},
    }, "Value" , "Text");
_

J'ai supprimé l'élément -1, et le réglage de chaque élément sélectionné vrai/faux.

Ensuite, à votre avis:

_@Html.DropDownListFor(m => m.UserType, Model.UserTypeOptions, "Select one")
_

De cette façon, si vous définissez l'élément "Sélectionner un" et que vous ne définissez aucun élément comme sélectionné dans la liste de sélection, la variable UserType sera nulle (la variable UserType doit être _int?_).

Si vous devez définir l'un des éléments SelectList comme étant sélectionné, vous pouvez utiliser:

_u.UserTypeOptions = new SelectList(options, "Value" , "Text", userIdToBeSelected);
_
69
Romias

Essayez ceci en rasoir

@{
    var selectList = new SelectList(
        new List<SelectListItem>
        {
            new SelectListItem {Text = "Google", Value = "Google"},
            new SelectListItem {Text = "Other", Value = "Other"},
        }, "Value", "Text");
}

puis

@Html.DropDownListFor(m => m.YourFieldName, selectList, "Default label", new { @class = "css-class" })

ou

@Html.DropDownList("ddlDropDownList", selectList, "Default label", new { @class = "css-class" })
14
VnDevil

Essayez ceci, juste un exemple:

u.UserTypeOptions = new SelectList(new[]
    {
        new { ID="1", Name="name1" },
        new { ID="2", Name="name2" },
        new { ID="3", Name="name3" },
    }, "ID", "Name", 1);

Ou

u.UserTypeOptions = new SelectList(new List<SelectListItem>
    {
        new SelectListItem { Selected = true, Text = string.Empty, Value = "-1"},
        new SelectListItem { Selected = false, Text = "Homeowner", Value = "2"},
        new SelectListItem { Selected = false, Text = "Contractor", Value = "3"},
    },"Value","Text");
1
Jaimin