Probleme mit ASP MVC + Html.DropDownList () unter Verwendung eines ModelView-Musters
Kürzlich habe ich eine Frage zur Dropdown-Liste des HTML-Helfers gestellt und sie funktioniert (Hier). Aber jetzt habe ich beschlossen, dass es viel klüger ist, auf ModelView-Muster umzusteigen, damit ich in meinen Ansichten auf stark typisierte Methoden usw. zugreifen kann. Ich habe in meinem anderen Thema einige Anpassungen am Code vorgenommen, und zwar folgendermaßen:
VacatureFormViewModel:
<code>public class VacaturesFormViewModel { public Vacatures Vacature { get; private set; } public SelectList EducationLevels { get; private set; } public SelectList Branches { get; private set; } public SelectList CareerLevels { get; private set; } Repository repository; // Constructor public VacaturesFormViewModel(Vacatures vacature) { this.Vacature = vacature; this.repository = new Repository(); this.EducationLevels = new SelectList(repository.GetAllEducationLevels(),"ID","Name",vacature.EducationLevels); this.Branches = new SelectList(repository.GetAllBranches(),"ID","Name",vacature.Branches); this.CareerLevels = new SelectList(repository.GetAllCareerLevels(), "ID", "Name", vacature.CareerLevels); } } </code>
BanenController:
<code>// // GET: /Banen/Create public ActionResult Create() { Vacatures vacature = new Vacatures(); return View(new VacaturesFormViewModel(vacature)); } // // POST: /Banen/Create [AcceptVerbs(HttpVerbs.Post)] public ActionResult Create(Vacatures vacatureToAdd) { if (ModelState.IsValid) { try { // TODO: Add insert logic here repository.AddToVacatures(vacatureToAdd); repository.SaveChanges(); // Return to listing page if succesful return RedirectToAction("Index"); } catch (Exception e) { return View(); } } } </code>
Und meine Create.aspx-Ansicht (Teil davon):
<code><% using (Html.BeginForm()) {%> <fieldset> <legend>Fields</legend> <p> <label for="Title">Title:</label> <%= Html.TextBox("Title", Model.Vacature.Title) %> <%= Html.ValidationMessage("Title", "*") %> </p> <p> <label for="Content">Content:</label> <%= Html.TextArea("Content", Model.Vacature.Content) %> <%= Html.ValidationMessage("Content", "*") %> </p> <p> <label for="EducationLevels">EducationLevels:</label> <%= Html.DropDownList("EducationLevels", Model.EducationLevels)%> <%= Html.ValidationMessage("EducationLevels", "*") %> </p> <p> <label for="CareerLevels">CareerLevels:</label> <%= Html.DropDownList("CareerLevels", Model.CareerLevels)%> <%= Html.ValidationMessage("CareerLevels", "*")%> </p> <p> <label for="Branches">Branches:</label> <%= Html.DropDownList("Branches", Model.Branches)%> <%= Html.ValidationMessage("Branches", "*")%> </p> <p> <input type="submit" value="Save" /> </p> </fieldset> <% } %> </code>
Zum Führen habe ich das benutztNerdDinner Tutorial von ScottGu und ich haben hier verschiedene Themen gelesen.
Meine Frage ist, ob es möglich ist, MVC ASP mein Karrierelevel, Bildungslevel und meine Branche (Dropdown-Listen) automatisch festlegen zu lassen, da es derzeit eine ID-Zeichenfolge zurückgibt, die nicht meinen Wünschen entspricht. Wenn ich die Erstellung der SelectList ändere in:
<code>this.CareerLevels = new SelectList(repository.GetAllCareerLevels(), vacature.CareerLevels); </code>
Ohne "ID" und "Name" wird also auch nichts gespeichert (ich denke, es wird immer noch als Zeichenfolge in der Post-Methode zurückgegeben und nicht das Objekt selbst) und daneben wird in der Ansicht Folgendes aufgeführt: vacature. EducationLevels usw. Es werden also nicht die Namen, sondern das Objekt selbst aufgelistet.
Letzte Frage Kurz gesagt, meine Frage ist, ob es möglich ist, mit diesem Ansatz meine Branche, mein Bildungsniveau und mein Karrierelevel festzulegen. Also nicht automatisch?
In diesem Fall muss ich noch Dinge verwenden wie:
<code>[AcceptVerbs(HttpVerbs.Post)] public ActionResult Create(FormCollection form) { Vacatures vacatureToAdd = new Vacatures(); // Retrieve the education level by its ID if (!form["EducationLevels"].Equals("")) { Guid educationID = new Guid(form["EducationLevels"]); vacatureToAdd.EducationLevels = repository.GetEducationLevelByID(educationID); } </code>
In meinem Controller? Oder gibt es andere, glattere Möglichkeiten.