C # mvc 3 mit Auswahlliste mit ausgewähltem Wert in Sicht

Ich arbeite an einer MVC3-Webanwendung. Ich möchte eine Liste von Kategorien, die angezeigt werden, wenn Sie ein Bl aus dem Anwendungsverwaltungssystem bearbeiten. In meinem Viewmodel habe ich die folgende Eigenschaft für eine Liste von Auswahllisten für Kategorien definiert.

///  /// The List of categories ///  [Display(Name = "Categorie")] public IEnumerable Categories { get; set; } 

Der nächste Schritt, mein Controller enthält die folgende Bearbeitungsaktion, bei der die Liste der Auswahllistenelemente aus der database gefüllt wird.

 public ActionResult Edit(Guid id) { var blogToEdit = _blogService.First(x => x.Id.Equals(id)); var listOfCategories = _categorieService.GetAll(); var selectList = listOfCategories.Select(x =>new SelectListItem{Text = x.Name, Value = x.Id.ToString(), Selected = x.Id.Equals(blogToEdit.Category.Id)}).ToList(); selectList.Insert(0, new SelectListItem{Text = Messages.SelectAnItem, Value = Messages.SelectAnItem}); var viewModel = new BlogModel { BlogId = blogToEdit.Id, Active = blogToEdit.Actief, Content = blogToEdit.Text, Title = blogToEdit.Titel, Categories = selectList //at this point i see the expected item being selected //Categories = new IEnumerable(listOfCategories, "Id", "Naam", blogToEdit.CategorieId) }; return View(viewModel); } 

Wenn ich einen Haltepunkt unmittelbar vor der Rückgabe der Ansicht einstelle, sehe ich, dass die Auswahlliste wie erwartet gefüllt ist. An diesem Punkt scheint alles in Ordnung zu sein. Das Viewmodel ist vollständig korrekt ausgefüllt. Dann habe ich aus meiner Sicht (ich benutze Razor) die folgenden zwei Regeln, die die Auswahlliste für mich rendern sollen.

 @Html.LabelFor(m => m.Categories) @Html.DropDownListFor(model=>model.Categories, Model.Categories, Model.CategoryId) @Html.ValidationMessageFor(m => m.Categories) 

Wenn ich den Code ausführe und die Ansicht öffne, um mein Blog zu bearbeiten, kann ich alle korrekten Daten sehen. Auch die Auswahlliste wird korrekt wiedergegeben, aber das Element, das ich auswählen möchte, hat seine Auswahl verloren. Wie kann das sein? Bis zu dem Punkt, an dem das Viewmodel mit der Ansicht zurückgegeben wird, ist alles in Ordnung. Aber wenn ich die Webseite im Browser anschaue, ist die Auswahlliste nur dort ohne die richtige Auswahl. Was fehlt mir hier? Oder falsch machen?

 @Html.DropDownListFor(model=>model.Categories, Model.Categories, Model.CategoryId) 

Hier verwenden Sie die Hilfsmethode nicht richtig. Das erste Argument muss eine Eigenschaft in Ihrem Ansichtsmodell sein, die den aktuell ausgewählten Wert enthält. Es sollte eine skalare Eigenschaft sein, keine Sammlung.

Also müssen Sie in Ihrem Ansichtsmodell eine solche Eigenschaft hinzufügen:

 [Display(Name = "Categorie")] public IEnumerable Categories { get; set; } public string SelectedValue { get; set; } 

Und in Ihrer Controller-Aktion:

 var selectList = listOfCategories.Select(x => new SelectListItem { Text = x.Name, Value = x.Id.ToString() }).ToList(); var viewModel = new BlogModel { BlogId = blogToEdit.Id, Active = blogToEdit.Actief, Content = blogToEdit.Text, Title = blogToEdit.Titel, Categories = selectList, // this is what sets the selected value SelectedValue = blogToEdit.Category.Id }; 

Und Ihrer Meinung nach einfach:

 @Html.DropDownListFor(x => x.SelectedValue, Model.Categories) 

Ich bin mir ziemlich sicher, dass ich die selected = true-Eigenschaft eines Select-Listenelements zuvor mit gutem Erfolg verwendet habe. Ein Problem, das ich hatte, war ein widersprüchlicher Wert in ViewData.