2009-02-24 7 views
6

J'utilise ASP MVC RC1.Comment définir une valeur pour l'option par défaut avec Html.DropDownList

Un formulaire que j'utilise contient une liste déroulante que j'ai mise dans une vue avec ce code.

<%= Html.DropDownList("areaid", (SelectList)ViewData["AreaId"], "Select Area Id")%> 

Cependant, lorsqu'ils sont rendus, ce que je reçois

<select id="areaid" name="areaid"> 
    <option value="">Select Area Id</option> 
    <option value="1">Home</option> 
    ... 
</select> 

Ce que je voudrais est l'option Choisir zone Id pour avoir une valeur de 0 et le marquer comme sélectionné par défaut si il est cohérent avec les autres valeurs et je peux valider si oui ou non une zone a été choisie car c'est une valeur obligatoire. AreaId est un entier alors quand je clique actuellement sur le formulaire sans toucher à la liste déroulante, MVC se plaint que "" n'est pas un entier et me donne une erreur de liaison. Comment définir une valeur pour l'option par défaut, puis la sélectionner dans le formulaire?

Merci, Dan

Répondre

21

Je pense que vous avez trois quatre options. Tout d'abord, lorsque vous construisez votre SelectList ou enumerable de SelectItemList, ajoutez la valeur de votre choix à votre étiquette d'option et à la valeur par défaut. Le mettre en haut en fera le défaut si une autre valeur n'est pas déjà choisie dans le modèle. Deuxièmement, vous pouvez construire les select (et options) "à la main" dans la vue en utilisant une boucle pour créer les options. Encore une fois, en ajoutant votre sélection par défaut si celle-ci n'est pas fournie dans le modèle. Troisièmement, utilisez l'extension DropDownList, mais modifiez la valeur de la première option en utilisant javascript une fois la page chargée.

Il ne semble pas possible d'utiliser l'extension DropDownList pour attribuer une valeur à une optionLabel car elle est codée en dur pour utiliser string.Empty. Ci-dessous l'extrait de code pertinent de http://www.codeplex.com/aspnet.

// Make optionLabel the first item that gets rendered. 
    if (optionLabel != null) { 
     listItemBuilder.AppendLine(ListItemToOption(new SelectListItem() { Text = optionLabel, Value = String.Empty, Selected = false })); 
    } 

EDIT: Enfin, la meilleure façon est d'avoir votre modèle prend une valeur Nullable et marquer au besoin à l'aide du RequiredAttribute. Je recommanderais d'utiliser un modèle spécifique à la vue plutôt qu'un modèle d'entité pour la vue. Puisque la valeur est Nullable, la chaîne vide fonctionnera correctement si elle est postée sans choisir de valeur. En le définissant comme valeur requise, la validation du modèle échouera avec un message approprié indiquant que la valeur est requise. Cela vous permettra d'utiliser l'assistant DropdownList tel quel.

public AreaViewModel 
{ 
    [Required] 
    public int? AreaId { get; set; } 

    public IEnumerable<SelectListItem> Areas { get; set; } 
    ... 
} 

@Html.DropDownListFor(model => model.AreaId, Model.Areas, "Select Area Id") 
+1

Merci. Je crée maintenant un objet List , insère une option par défaut avec la valeur 0 à l'index 0 et la passe à Html.DropDownList. Cela fonctionne un régal. – Hmobius

+0

Merci qui m'a aidé aussi! Il est triste que même avec MVC 3, il n'est pas possible d'ajouter la valeur par défaut:/ – LanFeusT

+0

@LanFeusT - cela a été répondu bien avant MVC3. Je l'ai mis à jour pour une meilleure méthode de traitement d'un point de vue du modèle, esp. avec MVC3. – tvanfosson

3

Pour MVC3, SelectList a une surcharge qui vous permet de définir la valeur sélectionnée.

Function Create() As ViewResult 

     ViewBag.EmployeeId = New SelectList(db.Employees, "Id", "Name", 1) 

     Return View() 

    End Function 

Dans ce cas, je sais que 1 est l'id de l'élément de la liste par défaut que je veux, mais on peut supposer que vous pouvez sélectionner la valeur par défaut par requête ou ce qui flotte jamais votre bateau

+0

Cela fonctionne très bien. Pour répondre à la question de Dan, je crois qu'il veut: –

0

au lieu de passer l'élément par défaut de la définition dans la vue, vous pouvez ajouter les données "Sélectionner la zone" au 0e index de la liste à partir du contrôleur.

De cette façon, les données Select zone a une valeur d'index de 0.

0

Je voulais utiliser la même SelectList pour les bas de chute multiples et ne voulais pas dupliquer le SelectList dans le modèle, donc je viens d'ajouter un nouveau Html Méthode d'extension qui a pris une valeur et défini l'élément sélectionné.

public static MvcHtmlString DropDownList(this HtmlHelper htmlHelper, string name, string value, IList<SelectListItem> selectList, object htmlAttributes) 
{ 
    IEnumerable<SelectListItem> items = selectList.Select(s => new SelectListItem {Text = s.Text, Value = s.Value, Selected = s.Value == value}); 
    return htmlHelper.DropDownList(name, items, null /* optionLabel */, htmlAttributes); 
} 
Questions connexes