web-dev-qa-db-fra.com

Html.DropdownListFor valeur sélectionnée non définie

Comment définir la valeur sélectionnée d'un fichier Html.DropDownListFor? Je me suis renseigné en ligne et j'ai constaté qu'il est possible d'y parvenir 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 arriver?

MODIFIER

J'ai mis à jour mon code car il y avait un léger changement dans les fonctionnalités, mais semble toujours rencontrer ce problème. C'est ce qui est à mon avis:

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

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

Des idées?

83
Ibrar Hussain

Votre code a des problèmes conceptuels:

Premier ,

@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é où la valeur sélectionnée est stockée une fois que vous avez soumis le formulaire. Donc, dans votre cas, vous devriez avoir une SelectedOrderId dans votre modèle ou quelque chose comme ça, afin de l'utiliser de cette façon: 

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

Seconde ,

En plus d’utiliser ViewBag, ce n’est pas un problème, mais il existe de meilleures méthodes (placez ces informations dans le ViewModel),il existe un "petit bogue" (ou un comportement non détecté) lorsque votre propriété ViewBag le SelectList, est le même nom de la propriété où vous mettezla valeur sélectionnée. Pour éviter cela, utilisez simplement un autre nom lorsque vous nommez la propriété contenant la liste des éléments.

Certains code que j'utiliserais si je vous évitais ces problèmes et écrivais un meilleur code MVC:

Viewmodel:

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")
157
Romias

Pour moi ne travaillait pas, travaillait ainsi:

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');
});
19
VINICIUS SIN

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. Il est possible que vous n’ayez pas de valeur 0 dans votre source pour la propriété Code. L’aide HTML va donc sélectionner le premier élément. Pour transmettre la valeur sélectionnée réelle à ce contrôle.

6
Felipe Oriani

Assurez-vous d’avoir ajusté la valeur sélectionnée avant d’attribuer.

//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" })
3
Nalan Madheswaran

Si vous savez ce qu'il y aura 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 .Il n'est pas nécessaire de définir la valeur par défaut à partir du côté HTML.

Dans le fichier du contrôleur.

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

Dans le fichier .cshtml.

@Html.DropDownListFor(row => row.TypeofCommission, new SelectList(Model.commissionTypeModelList, "type", "typeName"), "--Select--")
2
Smit Patel
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 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".

0
MEO

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;

Ajouter la liste à la ViewData:

ViewBag.CustomerTypes = customerTypes;

Utilisez ceci dans votre View:

@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

0
g.breeze

Je sais que ce n'est pas vraiment une réponse à la question, mais je cherchais un moyen d'initialiser DropDownList à partir d'une liste affichée à 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 un 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 exploré le document officiel msdn doc et constaté que DropDownListFor ne nécessitait pas nécessairement une 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 le Model.Locality comme élément sélectionné, car c’est a) le seul élément et b) il le dit déjà dans la propriété SelectListItem.Selected.

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

0
Damian Vogel

J'avais un problème similaire, j'utilisais le nom du ViewBag et de l'élément comme identiques. (Erreur de frappe)

0
Arun Prasad E S

Ajouter la section du contrôleur

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

Ajouter la section HTML

   @Html.DropDownList("Orders", null)

Une méthode simple

0
ibrahim ozboluk

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" })
     }
}
0
dewelloper

Linq to Dropdown avec élément vide, élément sélectionné (fonctionne à 100%)
(Fortement typé, chances d'erreur minimum) Toute modification de modèle sera reflétée 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 des 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 });
0
user4584103