web-dev-qa-db-fra.com

MVC - Définit la valeur sélectionnée de SelectList

Comment définir la propriété selectedvalue d'un SelectList après son instanciation sans une valeur selected;

SelectList selectList = new SelectList(items, "ID", "Name");

Je dois définir la valeur sélectionnée après cette étape

49
kaivalya

Si vous avez votre objet SelectList, parcourez simplement les éléments qu’il contient et définissez la propriété "Sélectionné" de l’élément souhaité.

foreach (var item in selectList.Items)
{
  if (item.Value == selectedValue)
  {
    item.Selected = true;
    break;
  }
}

Ou avec Linq:

var selected = list.Where(x => x.Value == "selectedValue").First();
selected.Selected = true;
65
womp

Un peu tard pour la fête ici, mais voici comment cela est simple:

ViewBag.Countries = new SelectList(countries.GetCountries(), "id", "countryName", "82");

cela utilise ma méthode getcountries pour renseigner un modèle appelé countries. Il est évident que vous devez le remplacer par une source de données, un modèle, etc., puis définit l'identifiant comme valeur dans la liste de sélection. puis ajoutez simplement le dernier paramètre, dans le cas présent "82" pour sélectionner l’élément sélectionné par défaut.

[edit] Voici comment utiliser ceci dans Razor:

@Html.DropDownListFor(model => model.CountryId, (IEnumerable<SelectListItem>)ViewBag.Countries, new { @class = "form-control" })

J'espère que cela sauve du temps à quelqu'un.

18
Alex Stephens

Utilisez simplement le troisième paramètre pour la valeur sélectionnée dans mvc4

@Html.DropDownList("CountryList", new SelectList(ViewBag.Countries, "Value", "Text","974"))

Ici, "974" est sélectionné Valeur spécifiée

Dans mon résultat, le pays sélectionné est désormais qatar.in C # comme ci-dessous` 

    foreach (CountryModel item in CountryModel.GetCountryList())
        {
            if (item.CountryPhoneCode.Trim() != "974")
            {
                countries.Add(new SelectListItem { Text = item.CountryName + " +(" + item.CountryPhoneCode + ")", Value = item.CountryPhoneCode });

            }
            else {


                countries.Add(new SelectListItem { Text = item.CountryName + " +(" + item.CountryPhoneCode + ")", Value = item.CountryPhoneCode,Selected=true });

            }
        }
13
mzonerz

Pourquoi essayez-vous de définir la valeur après avoir créé la liste? Je suppose que vous créez la liste dans votre modèle plutôt que dans votre vue. Je recommande de créer l'énumérable sous-jacent dans votre modèle, puis de l'utiliser pour créer la liste de sélection réelle:

<%= Html.DropDownListFor(m => m.SomeValue, new SelectList(Model.ListOfValues, "Value", "Text", Model.SomeValue)) %>

De cette façon, la valeur que vous avez sélectionnée est toujours définie au moment où la vue est rendue et non avant. De plus, vous n'avez pas besoin de mettre des classes d'interface utilisateur inutiles (par exemple, SelectList) dans votre modèle et celui-ci peut ne pas être au courant de l'interface utilisateur.

9
Doug Lampe

J'avais besoin d'une liste déroulante dans une grille modifiable avec des valeurs de liste présélectionnées. En résumé, les données de la liste de sélection sont fournies par le contrôleur à la vue. Elles sont donc créées avant que la vue ne les consomme. Une fois que la vue utilise la liste de sélection, je la confie à un assistant personnalisé qui utilise l’assistant DropDownList standard. Donc, une solution assez légère imo. Je suppose qu’il s’inscrit dans l’esprit ASP.Net MVC au moment de la rédaction; quand vous n'êtes pas heureux, lancez le vôtre ...

chaîne publique statique DropDownListEx (cette assistance HtmlHelper, nom de chaîne, SelectList selectList, object selectedValue) 
 {
 return helper.DropDownList (name, new SelectList (selectList.Items, selectList.DataValueField, selectList.DataTextField, selectedValue)); 
} 
2
Erik Lenaerts

Doug a répondu à ma question ... Mais je vais expliquer en quoi consiste exactement mon problème et en quoi Doug m'a aidé à résoudre le problème que vous pourriez rencontrer.

J'appelle jquery $.post et je remplace ma div par ma vue partielle, comme ça.

function AddNewAddress (paramvalue) {
    $.post(url, { param: paramvalue}, function(d) {
        $('#myDiv').replaceWith(d);
    });
}

Ce faisant, pour une raison quelconque, lorsque je suis entré dans mon modèle, ma propriété affiliée à la valeur sélectionnée n’a jamais été définie, et ce, jusqu’à ce que je sois entrée dans la vue.

Donc, ce que j’avais avant

@Html.DropDownListUnobtrusiveFor(model => model.CustomerAddresses[i].YearsAtAddress, Model.CustomerAddresses[i].YearsAtAddressSelectList, new {onchange = "return Address.AddNewAddress(this,'" + @Url.Action("AddNewAddress", "Address") + "'," + i + ")"})

cependant, même si Model.CustomerAddresses [i] .YearsAtAddressSelectList a été définie ... elle n'a pas défini la valeur sélectionnée.

Donc après....

 @Html.DropDownListUnobtrusiveFor(model => model.CustomerAddresses[i].YearsAtAddress, new SelectList(Model.CustomerAddresses[i].YearsAtAddressSelectList, "Value", "Text", Model.CustomerAddresses[i].YearsAtAddress), new { onchange = "return Address.AddNewAddress(this,'" + @Url.Action("AddNewAddress", "Address") + "'," + i + ")" })

et il a travaillé!

J'ai décidé de ne pas utiliser DropDownListFor car il y a un problème lors de l'utilisation de la validation non intrusive, c'est pourquoi je fais référence à ce qui suit si vous êtes curieux dans une classe classée 

HtmlExtensions.cs




[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")]

public static MvcHtmlString DropDownListUnobtrusiveFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList)
{
    return DropDownListUnobtrusiveFor(htmlHelper, expression, selectList, null /* optionLabel */, null /* htmlAttributes */);

}


[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")]

public static MvcHtmlString DropDownListUnobtrusiveFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, object htmlAttributes)
{
    return DropDownListUnobtrusiveFor(htmlHelper, expression, selectList, null /* optionLabel */, new RouteValueDictionary(htmlAttributes));

}


[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")]

public static MvcHtmlString DropDownListUnobtrusiveFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, IDictionary<string, object> htmlAttributes)
{
    return DropDownListUnobtrusiveFor(htmlHelper, expression, selectList, null /* optionLabel */, htmlAttributes);

}


[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")]

public static MvcHtmlString DropDownListUnobtrusiveFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel)
{
    return DropDownListUnobtrusiveFor(htmlHelper, expression, selectList, optionLabel, null /* htmlAttributes */);

}


[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")]

public static MvcHtmlString DropDownListUnobtrusiveFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel, object htmlAttributes)
{
    return DropDownListUnobtrusiveFor(htmlHelper, expression, selectList, optionLabel, new RouteValueDictionary(htmlAttributes));

}


[SuppressMessage("Microsoft.Design", "CA1011:ConsiderPassingBaseTypesAsParameters", Justification = "Users cannot use anonymous methods with the LambdaExpression type")]

[SuppressMessage("Microsoft.Design", "CA1006:DoNotNestGenericTypesInMemberSignatures", Justification = "This is an appropriate nesting of generic types")]

public static MvcHtmlString DropDownListUnobtrusiveFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, string optionLabel, IDictionary<string, object> htmlAttributes)
{
    if (expression == null)
    {
        throw new ArgumentNullException("expression");
    }


    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);



    IDictionary<string, object> validationAttributes = htmlHelper
        .GetUnobtrusiveValidationAttributes(ExpressionHelper.GetExpressionText(expression), metadata);



    if (htmlAttributes == null)
        htmlAttributes = validationAttributes;
    else
        htmlAttributes = htmlAttributes.Concat(validationAttributes).ToDictionary(k => k.Key, v => v.Value);



    return SelectExtensions.DropDownListFor(htmlHelper, expression, selectList, optionLabel, htmlAttributes);

}
2
Adam

J'utilise habituellement cette méthode

        public static SelectList SetSelectedValue(SelectList list, string value)
    {
        if (value != null)
        {
            var selected = list.Where(x => x.Value == value).First();
            selected.Selected = true;
            return list;
        }
        return list;
    }
1
Franchesco

Vous pouvez utiliser la méthode ci-dessous, ce qui est assez simple.

new SelectList(items, "ID", "Name",items.Select(x=> x.Id).FirstOrDefault());

Cela sélectionnera automatiquement le premier élément de votre liste. Vous pouvez modifier la requête ci-dessus en ajoutant une clause where.

1
mca

Je voulais que la liste déroulante sélectionne la valeur correspondante de l'id dans la méthode d'action. L'astuce consiste à définir la propriété Selected lors de la création de la collection SelectListItem. Cela ne fonctionnerait pas autrement, j'ai peut-être manqué quelque chose, mais en fin de compte, c'est plus élégant dans mon option.

Vous pouvez écrire n'importe quelle méthode qui retourne un booléen pour définir la valeur Selected en fonction de vos besoins. Dans mon cas, j'ai utilisé la méthode Equal existante.

public ActionResult History(long id)
        {
            var app = new AppLogic();
            var historyVM = new ActivityHistoryViewModel();

            historyVM.ProcessHistory = app.GetActivity(id);
            historyVM.Process = app.GetProcess(id);
            var processlist = app.GetProcessList();

            historyVM.ProcessList = from process in processlist
                                    select new SelectListItem
                                    {
                                        Text = process.ProcessName,
                                        Value = process.ID.ToString(),
                                        Selected = long.Equals(process.ID, id)                                    

                                    };

            var listitems = new List<SelectListItem>();

            return View(historyVM);
        }
0
Adrian Hedley