114 votes

Html.DropdownListFor la valeur sélectionnée n'est pas définie

Comment puis-je définir la valeur sélectionnée d'un Html.DropDownListFor? J'ai cherché en ligne et j'ai vu que cela peut être réalisé en utilisant le quatrième paramètre comme ci-dessous :

@Html.DropDownListFor(m => m, new SelectList(Model, "Code", "Name", 0),  "Veuillez sélectionner un pays")

Ma liste déroulante s'affiche alors comme ceci :

     Veuillez sélectionner un pays
     Royaume-Uni
     États-Unis
     ...

Mais pour une raison quelconque, le Royaume-Uni reste sélectionné mais je veux que "Veuillez sélectionner un pays" soit sélectionné.

Quelqu'un sait comment je peux y arriver?

MISE À JOUR

J'ai mis à jour mon code car il y avait un léger changement dans la fonctionnalité cependant je continue à rencontrer ce problème. Voici ce qui se trouve dans ma vue :

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Veuillez sélectionner un modèle de commande")

1 est l'id de l'option que je veux sélectionnée, j'ai également essayé avec le texte de l'option mais cela ne fonctionne pas non plus.

Des idées?

206voto

Romias Points 5668

Votre code comporte quelques problèmes conceptuels:

Premièrement,

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Veuillez sélectionner un modèle de commande")

Lorsque vous utilisez DropDownListFor, le premier paramètre est la propriété où votre valeur sélectionnée est stockée une fois que vous soumettez le formulaire. Donc, dans votre cas, vous devriez avoir un SelectedOrderId dans votre modèle ou quelque chose du genre, pour l'utiliser de cette manière:

@Html.DropDownListFor(n => n.SelectedOrderId, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Veuillez sélectionner un modèle de commande")

Deuxièmement,

En plus d'utiliser ViewBag, ce qui n'est pas faux mais il y a de meilleures façons (mettez ces informations dans le ViewModel à la place), il y a un "petit bug" (ou un comportement inattendu) lorsque votre propriété ViewBag, où vous stockez le SelectList, a le même nom que la propriété où vous placez la valeur sélectionnée. Pour éviter cela, utilisez simplement un autre nom lorsque vous nommez la propriété contenant la liste des éléments.

Un code que j'utiliserais si j'étais vous pour éviter ces problèmes et écrire un meilleur code MVC:

ViewModel:

public class MyViewModel{
   public int SelectedOrderId {get; set;}
   public SelectList OrderTemplates {get; set;}

   // Autres propriétés dont vous avez besoin dans votre vue
}

Contrôleur:

public ActionResult MonAction(){
   var model = new MyViewModel();
   model.OrderTemplates = new SelectList(db.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1);
   //Autre code d'initialisation

   return View(model);
}

Dans votre vue:

@Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Veuillez sélectionner un modèle de commande")

25voto

VINICIUS SIN Points 1271

Pour moi, cela ne fonctionnait pas donc j'ai fait comme ceci :

Contrôleur :

int selectedId = 1;

ViewBag.ItemsSelect = new SelectList(db.Items, "ItemId", "ItemName",selectedId);

Vue :

@Html.DropDownListFor(m => m.ItemId,(SelectList)ViewBag.ItemsSelect)

JQuery :

$("document").ready(function () {
    $('#ItemId').val('@Model.ItemId');
});

9voto

Felipe Oriani Points 11973

Lorsque vous passez un objet comme ceci :

new SelectList(Model, "Code", "Name", 0)

vous indiquez : la Source (Model) et la Clé ("Code") le Texte ("Name") et la valeur sélectionnée 0. Vous n'avez probablement pas de valeur 0 dans votre source pour la propriété Code, donc l'Assistant HTML sélectionnera le premier élément pour passer la vraie valeur sélectionnée à ce contrôle.

3voto

Smit Patel Points 1798

Si vous savez ce qui sera dans la vue, vous pouvez également définir la valeur par défaut depuis le contrôleur plutôt que de la configurer dans le fichier view/cshtml. Il n'est pas nécessaire de définir une valeur par défaut côté HTML.

Dans le fichier Controller.

commission.TypeofCommission = 1;
return View(commission);

Dans le fichier .cshtml.

@Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Sélectionner--")

3voto

Nalan M Points 834

Assurez-vous d'avoir tronqué la valeur sélectionnée avant de l'assigner.

//Modèle

public class SelectType
{
    public string Text { get; set; }
    public string Value { get; set; }
}

//Contrôleur

var types = new List();
types.Add(new SelectType() { Value =  0, Text = "Sélectionnez un type" });
types.Add(new SelectType() { Value =  1, Text = "Fiducie familiale" });
types.Add(new SelectType() { Value =  2, Text = "Fiducie unitaire"});
ViewBag.PartialTypes = types;

//Vue

@Html.DropDownListFor(m => m.PartialType, new SelectList(ViewBag.PartialTypes, "Value", "Text"), new { id = "Type" })

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X