2009-12-20 7 views
3

Je souhaite utiliser Html.DropDownList (nom de chaîne, IEnumerable SelectList, Object htmlAttributes) pour rendre une liste de sélection avec une valeur présélectionnée pour moi.HTML.DropDownList ne respecte pas la valeur présélectionnée

Ma liste de sélection est dans l'objet modèle de mon point de vue, donc j'ai été ÉCRITURE le code suivant:

<%= Html.DropDownList("aName", mySelectList, new { }) %> 

qui va rendre la liste de sélection sans la valeur présélectionnée.

Une solution que j'ai trouvé est passer le SelectList comme ViewData et de faire ce qui suit:

Dans le contrôleur:

ViewData["TimeZones"] = mySelectList; 

De l'avis:

<%= Html.DropDownList("TimeZones", null, new { }) %> 

De cette façon, la sélection La liste sera rendue avec la valeur présélectionnée, cependant, je ne veux pas être forcé de passer ma liste de sélection en tant que donnée de vue. Qu'est-ce que je fais mal? Merci d'avance pour votre aide.

+0

Comment créer mySelectList? Il n'y a pas besoin de 'new {}'. – LukLed

Répondre

1

Autobinding l'élément sélectionné

L'autre approche consiste à lier automatiquement l'élément sélectionné, et la transmission de la liste des éléments comme paramètre à la méthode d'assistance DropDownList.

Dans le contrôleur, vous faites exactement la même chose qu'auparavant, mais ne définissez pas true la propriété Selected de n'importe quel élément. Ensuite, vous devez également mettre dans le modèle de vue la valeur de l'élément que vous souhaitez sélectionner.

var model = new IndexViewModel() 
      { 
       ListItems = items, 
       SelectedItem = 2 
      }; 

Et enfin dans la vue, vous utilisez la surcharge qui accepte également le paramètre SelectList:

<%= Html.DropDownList("SelectedItem", Model.ListItems) %> 

La seule différence dans le code HTML rendu est que, avec la première approche, le nom du HTML L'élément sélectionné est ListItems, le second est SelectedItem. Ces approches sont très bien si vous créez votre propre liste, mais elles ne sont pas la solution optimale si vous recevez la liste d'options pour une méthode externe, par exemple à partir d'un référentiel de base de données.

Jetez un oeil à ce link

3

Vous pouvez simplement le faire (cela fonctionne):

<%: Html.DropDownList("DropdownName", new SelectList(ListItems, "Value", "Text", selectedItem), htmlAttributes)%> 

Laissez-moi savoir si cela ne fonctionne pas pour vous.

+0

Heureusement, cela fonctionne aussi avec le Razor VE. J'ai réussi à faire passer une List <> dans la collection ListItems. – hanzolo

0

Je sais que c'est un ancien article, mais j'ai rencontré un problème similaire dans MVC5. La solution est simple, mais j'ai eu du mal avec ça pendant un moment, alors j'ai pensé que je partagerais.

VS autogénère DropDownLists avec cela dans la vue:

@Html.DropDownList("EpisodeTypeId", null, htmlAttributes: new { @class = "form-control" }) 

Dans le contrôleur, VS génère automatiquement le code ViewBag différemment pour créer et éditer vs.

Voici le code d'une création:

ViewBag.EpisodeTypeId = new SelectList(db.EpisodeTypes, "Id", "Name"); 

Et d'une édition:

ViewBag.EpisodeTypeId = new SelectList(db.EpisodeTypes, "Id", "Name", episode.EpisodeTypeId); 

Ce quatrième argument est important pour Edits, comme on pouvait s'y attendre. Si vous l'omettez, la valeur de la base de données pour cet enregistrement ne sera pas présélectionnée dans DropDown.

Le code généré automatiquement par VS sera correct, mais si vous ajoutez des champs manuellement plus tard, c'est facile à manquer.

Questions connexes