web-dev-qa-db-fra.com

MVC5 - Comment définir "selectedValue" dans l'assistant DropDownListFor Html

Comme le dit la question: Comment définir selectedValue dans l’aide DropDownListFor Html?

J'ai essayé la plupart des autres solutions mais aucune n'a fonctionné, c'est pourquoi j'ouvre une nouvelle question.

Rien de cela n'a aidé:

@Html.DropDownListFor(m => m.TipPopustaId, new SelectList(Model.TipoviDepozita, "Id", "Naziv", 2), htmlAttributes: new { @class = "form-control" })

//Not working with or without cast
@Html.DropDownListFor(m => m.TipPopustaId, new SelectList(Model.TipoviDepozita, "Id", "Naziv", (ProjectName.Models.TipDepozita)Model.TipoviDepozita.Single(x => x.Id == 2)), htmlAttributes: new { @class = "form-control" })
@Html.DropDownListFor(m => m.TipPopustaId, new SelectList(Model.TipoviDepozita, "Id", "Naziv", (ProjectName.Models.TipDepozita)Model.TipoviDepozita.Where(x => x.Id == 2).FirstOrDefault()), htmlAttributes: new { @class = "form-control" })

@Html.DropDownListFor(m => m.TipPopustaId, new SelectList(Model.TipoviDepozita, "Id", "Naziv", new SelectListItem() { Value="2", Selected=true}), htmlAttributes: new { @class = "form-control" })

Je voudrais éviter la création manuelle de SelectListItems ou d'un ViewModel juste pour la liste si possible.

13
Dino

Lorsque vous utilisez la méthode DropDownListFor() (ou DropDownList()) pour se lier à une propriété de modèle, il s'agit de la valeur de la propriété qui définit l'option sélectionnée.

En interne, les méthodes génèrent leur propre IEnumerable<SelectListItem> et définissent la propriété Selected en fonction de la valeur de la propriété. Par conséquent, la définition de la propriété Selected dans votre code est ignorée. La seule fois où il est respecté est lorsque vous ne vous liez pas à une propriété de modèle, par exemple en utilisant

@Html.DropDownList("NotAModelProperty", new SelectList(Model.TipoviDepozita, "Id", "Naziv", 2))

Notez que vous pouvez inspecter le code source , en particulier les méthodes SelectInternal() et GetSelectListWithDefaultValue() pour voir comment cela fonctionne en détail.

Pour afficher l'option sélectionnée lors du premier rendu de la vue, définissez la valeur de la propriété dans la méthode GET avant de transmettre le modèle à la vue.

Je vous recommande également que votre modèle d'affichage contienne une propriété IEnumerable<SelectListItem> TipoviDepozita et que vous génériez la variable SelectList dans le contrôleur.

var model = new YourModel()
{
    TipoviDepozita = new SelectList(yourCollection, "Id", "Naziv"),
    TipPopustaId = 2 // set the selected option
}
return View(model);

alors la vue devient

@Html.DropDownListFor(m => m.TipPopustaId, Model.TipoviDepozita, new { @class = "form-control" })
17
user3559349

Assurez-vous que votre valeur de sélection renvoyée est une chaîne et non pas int lorsque vous la déclarez dans votre modèle.

Exemple:

public class MyModel
{
    public string TipPopustaId { get; set; }
}
1
p.sturge
public static class EnumHelper
{
    public static SelectList EnumToSelectList<TEnum>(this Type enumType, object selectedValue)
    {  
        return new SelectList(Enum.GetValues(enumType).Cast<TEnum>().ToList().ToDictionary(n=> n), "Key", "Value", selectedValue);
    }
}

Et à votre avis:

@Html.DropDownListFor(model => model.Role, EnumHelper.EnumToSelectList<Role>(typeof(Role), Model.Role),  new { htmlAttributes = new { @class = "padding_right" } })
@Html.ValidationMessageFor(model => model.Role, "", new { @class = "text-danger" })

Au lieu d’EnumToList, utilisez une autre liste et sélectionnez Clé et valeur dans les propriétés de votre type de liste.

0
user10155578