Comment puis-je obtenir cette liste de sélection ASP.NET MVC?

Je crée une liste de sélection dans mon contrôleur, à afficher dans la vue.

J’essaie de le créer à la volée, une sorte de chose … comme ça …

myViewData.PageOptionsDropDown = new SelectList(new [] {"10", "15", "25", "50", "100", "1000"}, "15"); 

Il comstack, mais la sortie est mauvaise …

  10 15 25 50 100 1000  

Notez comment aucun article n’est sélectionné?

Comment puis-je réparer cela??

    C’est comme ça que je le fais

     IList customers = repository.GetAll(); IEnumerable selectList = from c in customers select new SelectListItem { Selected = (c.CustomerID == invoice.CustomerID), Text = c.Name, Value = c.CustomerID.ToSsortingng() }; 

    Au second coup d’œil, je ne suis pas sûr de savoir ce que vous cherchez …

    J’utilise une méthode d’extension:

    usage

     var departmentItems = departments.ToSelectList(d => d.Code + " - " + d.Description, d => d.Id.ToSsortingng(), " - "); var functionItems = customerFunctions.ToSelectList(f => f.Description, f => f.Id.ToSsortingng(), " - "); 

    avec

     public static class MCVExtentions { public static List ToSelectList( this IEnumerable enumerable, Func text, Func value, ssortingng defaultOption) { var items = enumerable.Select(f => new SelectListItem() { Text = text(f), Value = value(f) }).ToList(); items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" }); return items; } } 

    En utilisant le constructeur qui accepte des items, dataValueField, dataTextField, selectedValue tant que parameters:

     ViewData["myList"] = new SelectList(new[] { "10", "15", "25", "50", "100", "1000" } .Select(x => new {value = x, text = x}), "value", "text", "15"); 

    Alors à votre avis:

     < %=Html.DropDownList("myList") %> 

    À partir de la réponse de Thomas Stock, j’ai créé ces méthodes ToSelectList surchargées:

     using System; using System.Collections.Generic; using System.Linq; using System.Web.Mvc; public static partial class Helpers { public static IEnumerable ToSelectList(this IEnumerable enumerable, Func value, bool selectAll = false) { return enumerable.ToSelectList(value, value, selectAll); } public static IEnumerable ToSelectList(this IEnumerable enumerable, Func value, object selectedValue) { return enumerable.ToSelectList(value, value, new List() { selectedValue }); } public static IEnumerable ToSelectList(this IEnumerable enumerable, Func value, IEnumerable selectedValues) { return enumerable.ToSelectList(value, value, selectedValues); } public static IEnumerable ToSelectList(this IEnumerable enumerable, Func value, Func text, bool selectAll = false) { foreach (var f in enumerable.Where(x => x != null)) { yield return new SelectListItem() { Value = value(f).ToSsortingng(), Text = text(f).ToSsortingng(), Selected = selectAll }; } } public static IEnumerable ToSelectList(this IEnumerable enumerable, Func value, Func text, object selectedValue) { return enumerable.ToSelectList(value, text, new List() { selectedValue }); } public static IEnumerable ToSelectList(this IEnumerable enumerable, Func value, Func text, IEnumerable selectedValues) { var sel = selectedValues != null ? selectedValues.Where(x => x != null).ToList().ConvertAll(x => x.ToSsortingng()) : new List(); foreach (var f in enumerable.Where(x => x != null)) { yield return new SelectListItem() { Value = value(f).ToSsortingng(), Text = text(f).ToSsortingng(), Selected = sel.Contains(value(f).ToSsortingng()) }; } } } 

    Dans votre contrôleur, vous pouvez effectuer les opérations suivantes:

     var pageOptions = new[] { "10", "15", "25", "50", "100", "1000" }; ViewBag.PageOptions = pageOptions.ToSelectList(o => o, "15" /*selectedValue*/); 

    Et enfin dans votre vue, mettez:

     @Html.DropDownList("PageOptionsDropDown", ViewBag.PageOptions as IEnumerable, "(Select one)") 

    Il en résultera la sortie souhaitée – bien sûr, vous pouvez omettre l’option "(Select one)" ci-dessus si vous ne voulez pas le premier élément vide:

      

    Mise à jour: Une liste de codes révisée peut être trouvée ici avec des commentaires XML.

    Le problème est que SelectList fonctionne comme prévu. Le bug est dans la conception. Vous pouvez définir la propriété Selected dans SelectedItem, mais cela sera complètement ignoré si vous parcourez la liste avec GetEnumerator () (ou si Mvc le fait pour vous). Mvc va créer de nouveaux SelectListItems à la place.

    Vous devez utiliser le moteur SelectList avec le SelectListItem [], le Text-Name, le Value-Name et le SelectedValue. Soyez conscient de passer en tant que SelectedValue la valeur de SelectListItem, que vous souhaitez sélectionner, pas le SelectListItem lui-même! Exemple:

     SelectList sl = new SelectList( new[]{ new SelectListItem{ Text="one", Value="1"}, new SelectListItem{ Text="two", Value="2"}, new SelectListItem{ Text="three", Value="3"} }, "Text", "Value", "2" ); 

    (pas testé cela, mais j’ai eu le même problème)

    alors la 2ème option obtiendra l’atsortingbut selected = “selected”. Cela ressemble à de bons vieux DataSets 😉

    Ceci est une option:

     myViewData.PageOptionsDropDown = new[] { new SelectListItem { Text = "10", Value = "10" }, new SelectListItem { Text = "15", Value = "15", Selected = true } new SelectListItem { Text = "25", Value = "25" }, new SelectListItem { Text = "50", Value = "50" }, new SelectListItem { Text = "100", Value = "100" }, new SelectListItem { Text = "1000", Value = "1000" }, } 

    Si c’est tout ce que vous voulez faire, déclarer simplement le tableau sous forme de chaîne corrige le problème de l’élément sélectionné:

     myViewData.PageOptionsDropDown = new SelectList(new ssortingng[] {"10", "15", "25", "50", "100", "1000"}, "15"); 

    Il est très simple de faire fonctionner SelectList et SelectedValue, même si votre propriété n’est pas un object simple comme Int, Ssortingng ou Double.

    Exemple:

    En supposant que notre object Region est quelque chose comme ceci:

     public class Region { public Guid ID { get; set; } public Guid Name { get; set; } } 

    Et votre modèle de vue est quelque chose comme:

     public class ContactViewModel { public DateTime Date { get; set; } public Region Region { get; set; } public List Regions { get; set; } } 

    Vous pouvez avoir le code ci-dessous:

     @Html.DropDownListFor(x => x.Region, new SelectList(Model.Regions, "ID", "Name")) 

    Seulement si vous remplacez la méthode ToSsortingng de l’object Region par quelque chose comme:

     public class Region { public Guid ID { get; set; } public Guid Name { get; set; } public override ssortingng ToSsortingng() { return ID.ToSsortingng(); } } 

    Cela garantit 100% de travail.

    Mais je pense vraiment que la meilleure façon de faire fonctionner SelectList à 100% dans toutes les circulations est d’utiliser la méthode Equals pour tester la valeur de la propriété DropDownList ou ListBox par rapport à chaque élément de la collection d’éléments.

    Il semble que si vous avez une vue fortement typée, vous devez modifier l’ID de la liste déroulante afin qu’elle ne soit PAS le nom d’une propriété de la classe héritée. Vous devez ensuite mettre une logique dans votre méthode edit (POST) pour extraire la valeur sélectionnée de la collection FORMC et la mettre sur votre instance avant de valider vos modifications.

    C’est certainement un peu étrange, mais je l’ai essayé et ça marche.

    Donc, si votre classe a un champ appelé CountryId et que vous affichez une liste de noms de pays, faites en sorte que la liste déroulante ait un identifiant de CountryName plutôt que CountryId, alors dans l’article, vous pouvez faire quelque chose avec Collection [“CountryName”] .

    J’ai eu exactement le même problème. La solution est simple. Changez simplement le paramètre “name” transmis à l’assistant DropDownList en un élément qui ne correspond à aucune des propriétés existantes dans votre ViewModel. lire plus ici: http://www.dotnetguy.co.uk/post/2009/06/25/net-mvc-selectlists-selected-value-does-not-get-set-in-the-view

    Je cite le Dan Watson:

    Dans MVC si la vue est fortement typée, l’option sélectionnée de la liste de sélection sera remplacée et la propriété d’option sélectionnée sur le constructeur n’atteindra jamais la vue et la première option de la liste déroulante sera sélectionnée à la place (pourquoi est-ce un peu mystérieux) .

    à votre santé!

    Toutes ces réponses ont fière allure, mais il semblerait que le contrôleur prépare les données pour une vue dans un format structuré bien connu plutôt que de laisser la vue simplement parcourir un IEnumerable <> délivré via le modèle et créer une liste de sélection standard, puis laisser DefaultModelBinder renvoyer l’élément sélectionné via un paramètre d’action. Oui non, pourquoi pas Séparation des préoccupations, oui? Semble étrange d’avoir le contrôleur pour construire quelque chose si l’interface utilisateur et la vue spécifique.

    Simple:

     ssortingng[] someName = new ssortingng[] {"10", "15", "25", "50", "100", "1000"}; myViewData.PageOptionsDropDown = new SelectList(someName, "15"); 

    En utilisant votre exemple cela a fonctionné pour moi:

    manette:

     ViewData["PageOptionsDropDown"] = new SelectList(new[] { "10", "15", "25", "50", "100", "1000" }, "15"); 

    vue:

     < %= Html.DropDownList("PageOptionsDropDown")%> 

    Je l’ai juste couru comme ça et n’ai eu aucun problème,

     public class myViewDataObj { public SelectList PageOptionsDropDown { get; set; } } public ActionResult About() { myViewDataObj myViewData = new myViewDataObj(); myViewData.PageOptionsDropDown = new SelectList(new[] { "10", "15", "25", "50", "100", "1000" }, "15"); ViewData["myList"] = myViewData.PageOptionsDropDown; return View(); } 

    et

     < %=Html.DropDownList("myList") %> 

    cela a également fonctionné si vous faites cela,

     public ActionResult About() { myViewDataObj myViewData = new myViewDataObj(); myViewData.PageOptionsDropDown = new SelectList(new[] { "10", "15", "25", "50", "100", "1000" }); ViewData["myListValues"] = myViewData.PageOptionsDropDown; ViewData["myList"] = "15"; return View(); } 

    et

     < %=Html.DropDownList("myList",(IEnumerable)ViewData["myListValues"]) %> 
     MonthRepository monthRepository = new MonthRepository(); IQueryable entities = monthRepository.GetAllMonth(); List monthEntities = new List(); foreach(var r in entities) { monthEntities.Add(r); } ViewData["Month"] = new SelectList(monthEntities, "MonthID", "Month", "Mars"); 

    Je le fais comme ça:

     List list = new List{ new SelectListItem {Selected = true, Text = "Select", Value = "0"}, new SelectListItem {Selected = true, Text = "1", Value = "1"}, new SelectListItem {Selected = true, Text = "2", Value = "2"} }; return list.ToArray(); 

    Le ToArray () s’occupe des problèmes.

    Si vous voulez passer un texte aléatoire à votre DropDownList, par exemple –Select–, vous pouvez facilement faire ceci en utilisant ce code:

     @Html.DropDownListFor(x => x.CategoryId, new SelectList(Model.Categories, "Id", "Name"), "--Select--", new { @class = "form-control" }) 

    Il se peut que vous ayez une certaine ambiguïté dans votre ViewData:

    Jetez un oeil ici

    la valeur sélectionnée dans le modèle tire parti de l’élément par défaut. (Je suis d’accord, je n’ai pas lu tous les articles)

    Je ne me souviens plus de la configuration de mvc 1, mais il semble que la liste de sélection devait être identique à celle du champ auquel elle appartenait …

    Ce que j’ai trouvé, comme quelqu’un l’a dit plus haut, c’est que mes listes de sélection ne fonctionnaient pas dans mvc2 lorsque ViewData était envoyé comme il était nommé comme le champ.

    Par exemple:

    < %= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForName"]) %>

    travaille quand

    < %= Html.DropDownListFor((model => model.ForID), (SelectList)ViewData["ForID"]) %>

    ne fonctionne pas car le nom ViewData “ForID” est nommé de la même manière que le champ pour lequel il travaille

    Une explication possible est que la valeur de liste de sélection à laquelle vous êtes lié n’est pas une chaîne.

    Donc, dans cet exemple, le paramètre ‘PageOptionsDropDown’ est-il une chaîne dans votre modèle? Parce que si ce n’est pas le cas, la valeur sélectionnée dans la liste ne sera pas affichée.

    Si vous regardez dans le code source de MVC 2 à la méthode d’extension Html.DropDownList, il ne vérifie jamais la propriété SelectList de la classe SelectedValue. Il n’essaiera que de faire correspondre votre modèle.

    Tout ce qui précède sont toutes des variations sur un thème, c.-à-d. Comment envoyer un tas de données à la vue pour une liste déroulante et elles sont toutes aussi bonnes l’une que l’autre (plus ou moins).

    Le problème est dans la vue. Créez votre propre méthode d’extension DropDownList qui respecte la valeur de sélection que vous avez définie ou itérez-la manuellement. Ce qui fonctionne le mieux pour vous

    Si vous avez une collection dans votre modèle et que votre vue est fortement typée, certaines variantes fonctionneront:

     @Html.DropDownListFor(x => x.RegionID, new SelectList(Model.Regions,"RegionID", "RegionName", Model.RegionID)) 

    -ou-

     @Html.DropDownList("RegionID", new SelectList(Model.Regions, "RegionID", "RegionName", Model.RegionID))