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

97

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

@Html.DropDownListFor(m => m, new SelectList(Model, "Code", "Name", 0),  "Please select a country")

Ma liste de sélection s'affiche alors comme ceci:

<select id="ShipFromCountries" name="ShipFromCountries">
     <option value="">Please select a country</option>
     <option value="GB">United Kingdom</option>
     <option value="US">United States</option>
     ...
</select>

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

Quelqu'un sait comment je peux y parvenir?

ÉDITER

J'ai mis à jour mon code car il y a eu un léger changement de fonctionnalité, mais semble toujours rencontrer ce problème. Voici ce que je pense:

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

1est l'Id du optionque je veux sélectionné, j'ai aussi essayé avec le texte du optionmais cela ne fonctionne pas non plus.

Des idées?

Ibrar Hussain
la source

Réponses:

181

Votre code présente des problèmes conceptuels:

Premièrement ,

@Html.DropDownListFor(n => n.OrderTemplates, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

Lorsque vous utilisez DropDownListFor, le premier paramètre est la propriété dans laquelle la valeur sélectionnée est stockée une fois que vous soumettez le formulaire. Donc, dans votre cas, vous devriez avoir une SelectedOrderIdpartie de votre modèle ou quelque chose comme ça, afin de l'utiliser de cette manière:

@Html.DropDownListFor(n => n.SelectedOrderId, new SelectList(Model.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1), "Please select an order template")

Deuxièmement ,

Mis à part l'utilisation de ViewBag, ce n'est pas faux mais il existe de meilleures façons (mettez ces informations dans le ViewModel à la place), il y a un "petit bug" (ou un comportement non détecté) lorsque votre propriété ViewBag, où vous tenez la SelectList, est le même nom de la propriété où vous avez mis 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 peu de code que j'utiliserais si j'étais à votre place pour éviter ces problèmes et écrire un meilleur code MVC:

Modèle de vue:

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

   // Other properties you need in your view
}

Manette:

public ActionResult MyAction(){
   var model = new MyViewModel();
   model.OrderTemplates = new SelectList(db.OrderTemplates, "OrderTemplateId", "OrderTemplateName", 1);
   //Other initialization code

   return View(model);
}

Dans votre vue:

@Html.DropDownListFor(n => n.SelectedOrderId, Model.OrderTemplates, "Please select an order template")
Romias
la source
42
Saved my day: "... il y a un petit bogue lorsque votre propriété ViewBag où vous tenez la SelectList est le même nom de la propriété où vous avez mis la valeur sélectionnée. Pour éviter cela, utilisez simplement un autre nom lorsque vous nommez la propriété contenant la liste des articles. " Je vous remercie!
Michael A. Volz aka Flynn
4
Ce "petit bug" est de la folie absolue! Je viens de perdre 2 heures de ma vie à cause de ça. Comment quelque chose d'aussi évident peut-il encore exister et ne pas être corrigé?
cen
1
Flynn, votre commentaire devrait en fait être une réponse. J'ai essayé des implémentations folles pour que ma liste déroulante fonctionne et c'était la solution simple
Dwayne Hinterlang
2
il y a un petit bug ? Ce n'est pas du tout un bug. La liaison de modèle fonctionne en se liant à la valeur d'une propriété et lorsque vous vous liez à OrderTemplatesvotre tentative de liaison à une ViewBagpropriété qui est typeof IEnumerabe<SelectListItem>. Mais un <select>élément ne peut pas se lier à une collection d'objets complexes (uniquement un type valeur)
Putain de merde, j'aurais perdu une journée entière sans cette réponse. Sérieusement, LITTLE BUG est la raison pour laquelle nous devrions renflouer le viewbag
Digne7
22

Pour moi, cela ne fonctionnait pas, donc cela fonctionnait de cette façon:

Manette:

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');
});
VINICIUS SIN
la source
2
Votre contrôleur a le mauvais nombre de parenthèses: il a une parenthèse ouvrante et deux parenthèses fermantes.
Amos Long
La logique JQuery fonctionne pour moi. Je vous remercie.
Shashank
7

Lorsque vous passez un objet comme celui-ci:

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

vous dites: la source ( Model) et la clé ( "Code") le texte ( "Name") et la valeur sélectionnée 0. Vous n'avez probablement pas de 0valeur dans votre source pour la Codepropriété, donc le HTML Helper sélectionnera le premier élément pour transmettre la valeur réelle selectedValue à ce contrôle.

Felipe Oriani
la source
3

Assurez-vous que vous avez coupé la valeur sélectionnée avant d'affecter.

//Modèle

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

//Manette

var types = new List<SelectType>();
types.Add(new SelectType() { Value =  0, Text = "Select a Type" });
types.Add(new SelectType() { Value =  1, Text = "Family Trust" });
types.Add(new SelectType() { Value =  2, Text = "Unit Trust"});
ViewBag.PartialTypes = types;

//Vue

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

Si vous savez ce qui sera dans la vue, vous pouvez également définir la valeur par défaut à partir de Controller plutôt que de la configurer dans le fichier view / cshtml. Pas besoin de définir la valeur par défaut du 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"), "--Select--")
Smit Patel
la source
1

Tu devrais oublier la classe

SelectList

Utilisez ceci dans votre contrôleur:

var customerTypes = new[] 
{ 
    new SelectListItem(){Value = "all", Text= "All"},
    new SelectListItem(){Value = "business", Text= "Business"},
    new SelectListItem(){Value = "private", Text= "Private"},
};

Sélectionnez la valeur:

var selectedCustomerType = customerTypes.FirstOrDefault(d => d.Value == "private");
if (selectedCustomerType != null)
    selectedCustomerType.Selected = true;

Ajoutez la liste à ViewData:

ViewBag.CustomerTypes = customerTypes;

Utilisez ceci dans votre vue:

@Html.DropDownList("SectionType", (SelectListItem[])ViewBag.CustomerTypes)

-

Plus d'informations sur: http://www.asp.net/mvc/overview/older-versions/working-with-the-dropdownlist-box-and-jquery/using-the-dropdownlist-helper-with-aspnet-mvc

g.breeze
la source
0

Ajouter la section contrôleur

  ViewBag.Orders= new SelectList(db.Orders, "Id", "business", paramid);

Ajouter la section Html

   @Html.DropDownList("Orders", null)

Une méthode simple

ibrahim ozboluk
la source
Un traitement de transaction alternatif facile
ibrahim ozboluk
0

Pour moi, solution générale :)

@{
     var selectedCity = Model.Cities.Where(k => k.Id == Model.Addres.CityId).FirstOrDefault();
     if (selectedCity != null)
     { 
         @Html.DropDownListFor(model => model.Addres.CityId, new SelectList(Model.Cities, "Id", "Name", selectedCity.Id), new { @class = "form-control" })
     }
     else
     { 
         @Html.DropDownListFor(model => model.Cities, new SelectList(Model.Cities, "Id", "Name", "1"), new { @class = "form-control" })
     }
}
Hamit YILDIRIM
la source
0

Linq to Dropdown avec élément vide, élément sélectionné (fonctionne à 100%)
(Fortement typé, risque d'erreur minimum) Tout changement de modèle sera reflété dans la liaison

Manette

public ActionResult ManageSurveyGroup()
    {
        tbl_Survey sur = new tbl_Survey();
        sur.Survey_Est = "3";

        return View(sur);
    }

Vue

        @{


    //Step One : Getting all the list
    var CompEstdList = (from ComType in db.tbl_CompEstdt orderby ComType.Comp_EstdYr select ComType).ToList();

    //Step Two  : Adding a no Value item **
    CompEstdList.Insert(0, new eDurar.Models.tbl_CompEstdt { Comp_Estdid = 0, Comp_EstdYr = "--Select Company Type--" });

    //Step Three : Setting selected Value if value is present
    var selListEstd= CompEstdList.Select(s => new SelectListItem { Text = s.Comp_EstdYr, Value = s.Comp_Estdid.ToString() });

        }
        @Html.DropDownListFor(model => model.Survey_Est, selListEstd)
        @Html.ValidationMessageFor(model => model.Survey_Est)

Cette méthode de liaison de données est également possible

var selList = CompTypeList.Select(s => new SelectListItem { Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString(), Selected = s.CompTyp_Id == 3 ? true : false });

la source
var selList = CompTypeList.Select (s => new SelectListItem {Text = s.CompTyp_Name, Value = s.CompTyp_Id.ToString (), Selected = s.CompTyp_Id == 3? true: false});
0

Je sais que ce n'est pas vraiment une réponse à la question, mais je cherchais un moyen d'initialiser la DropDownList à partir d'une liste à la volée dans la vue lorsque je n'arrêtais pas de tomber sur ce message.

Mon erreur est que j'ai essayé de créer une SelectList à partir d'un dictionnaire comme ceci:

//wrong!
@Html.DropDownListFor(m => m.Locality, new SelectList(new Dictionary<string, string>() { { Model.Locality, Model.Locality_text } }, Model.Locality, ...

J'ai ensuite fouillé dans la documentation officielle de msdn , et j'ai trouvé que DropDownListForcela ne nécessite pas nécessairement un SelectList, mais plutôt un IEnumerable<SelectListItem>:

//right
@Html.DropDownListFor(m => m.Locality, new List<SelectListItem>() { new SelectListItem() { Value = Model.Locality, Text = Model.Locality_text, Selected = true } }, Model.Locality, new { @class = "form-control select2ddl" })

Dans mon cas, je peux probablement aussi omettre l' Model.Localityélément sélectionné, car c'est a) le seul élément et b) il le dit déjà dans la SelectListItem.Selectedpropriété.

Juste au cas où vous vous poseriez la question, la source de données est une page AJAX, qui est chargée dynamiquement à l'aide du contrôle SelectWoo / Select2.

Damian Vogel
la source
0
public byte UserType
public string SelectUserType

Vous devez en obtenir un et en définir un différent. La valeur sélectionnée ne peut pas être le même élément que celui que vous êtes sur le point de définir.

@Html.DropDownListFor(p => p.SelectUserType, new SelectList(~~UserTypeNames, "Key", "Value",UserType))

J'utilise le dictionnaire Enum pour ma liste, c'est pourquoi il existe une paire «clé», «valeur».

MEO
la source
0

J'ai eu un problème similaire, j'utilisais le nom ViewBag et Element comme étant le même. (Erreur de frappe)

Arun Prasad ES
la source
0

Ce sont des problèmes de CSS. Je ne sais pas pourquoi @ Html.DropDownListFor dans Bootstrap 4 fonctionne. C'est sûrement un problème de conception de classe. Quoi qu'il en soit, le travail autour est, si votre zone de saisie Dropdown a un remplissage CSS: #px, # px; élément puis désactivez-le. J'espère que cela fonctionnera.

Naz Hassan
la source