En parcourant le code source d'ASP.NET MVC 2, vous trouverez quelques solutions à ce problème. Essentiellement, tout SelectListItem
dans le SelectList
passée dans la méthode d'extension de l'aide qui a l'attribut Selected
définie à true n'a pas d'influence sur la propriété <option>
rendu avec l'élément selected
appliqué à l'élément.
El selected
l'attribut <option>
est déterminée par
1) vérifier que la méthode d'extension de l'aide a reçu un fichier SelectList
. Si cette valeur est nulle, le cadre recherche dans les données de vue une valeur correspondant à la clé qui est la propriété du modèle de vue pour laquelle vous souhaitez rendre la liste déroulante. Si la valeur est un SelectList
ce qui sera utilisé pour rendre l <select>
y compris en prenant toute valeur sélectionnée, tant que l'état du modèle pour la propriété du modèle est nul.
2) Si un SelectList
a été transmis dans la méthode d'extension de l'aide et que l'état du modèle pour la propriété du modèle est nul, le cadre recherchera dans les données de vue une valeur par défaut, en utilisant le nom de la propriété du modèle comme clé. La valeur dans les données de vue est convertie en une chaîne de caractères et tout élément dans le champ SelectList
transmises à la méthode d'extension de l'aide et dont la valeur (si aucune valeur n'est définie, le texte sera vérifié) correspond à la valeur par défaut auront l'attribut Selected
définie à true, ce qui rendra une <option>
avec l'attribut selected="selected"
.
En mettant tout cela ensemble, je vois deux options plausibles pour qu'une option soit sélectionnée et que l'on utilise l'option fortement typée DropDownListFor
:
En utilisant le modèle de vue suivant
public class CategoriesViewModel
{
public string SelectedCategory { get; private set ; }
public ICollection<string> Categories { get; private set; }
public CategoriesViewModel(string selectedCategory, ICollection<string> categories)
{
SelectedCategory = selectedCategory;
Categories = categories;
}
}
Option 1
Définissez une valeur dans les ViewData du contrôleur qui rend votre vue, en fonction du nom de la propriété de la collection utilisée pour rendre la liste déroulante.
l'action du contrôleur
public class CategoriesController
{
[HttpGet]
public ViewResult Select()
{
/* some code that gets data from a datasource to populate the view model */
ICollection<string> categories = repository.getCategoriesForUser();
string selectedCategory = repository.getUsersSelectedCategory();
CategoriesViewModel model = new CategoriesViewModel(selectedCategory, categories);
this.ViewData["Categories"] = selectedCategory;
return View(model);
}
[HttpPost]
public ActionResult Select(CategoriesViewModel model)
{
/* some code that does something */
}
}
et dans la vue fortement typée
<%: Html.DropDownListFor(m => m.Categories, Model.Categories.Select(c => new SelectListItem { Text = c, Value = c }), new { @class = "my-css-class" }) %>
Option 2
Rendre la liste déroulante en utilisant le nom de la propriété du ou des éléments sélectionnés
l'action du contrôleur
public class CategoriesController
{
[HttpGet]
public ViewResult Select()
{
/* some code that gets data from a datasource to populate the view model */
ICollection<string> categories = repository.getCategoriesForUser();
string selectedCategory = repository.getUsersSelectedCategory();
CategoriesViewModel model = new CategoriesViewModel(selectedCategory, categories);
return View(model);
}
[HttpPost]
public ActionResult Select(CategoriesViewModel model)
{
/* some code that does something */
}
}
et dans la vue fortement typée
<%: Html.DropDownListFor(m => m.SelectedCategory, Model.Categories.Select(c => new SelectListItem { Text = c, Value = c }), new { @class = "my-css-class" }) %>