Kürzlich habe ich eine Frage über die HTML-Helfer Dropdown-Liste und habe es funktioniert (here). Aber jetzt habe ich entschieden, dass es viel schlauer ist, zu ModelView Patterns zu wechseln, so dass ich in meinen Ansichten etc. stark typisierte Methoden verwenden kann. Was ich getan habe, war, dass ich den Code in meinem anderen Thema wie folgt geändert habe:Probleme mit ASP MVC + Html.DropDownList() mit einem ModelView Pattern
VacatureFormViewModel:
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);
}
}
BanenController:
//
// 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();
}
}
}
Und meine Create.aspx Ansicht (ein Teil davon):
<% 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>
<% } %>
Für die Anleitung habe ich das NerdDinner Tutorial von ScottGu verwendet und ich habe verschiedene Themen hier gelesen.
Meine Frage ist, wenn es MVC ASP möglich ist, meinen carrierlevel, Ausbildungsniveau und branche (Dropdown-Listen) automatisch zu setzen, wie es derzeit eine ID-Zeichenfolge zurückgibt, die nicht was ich will. Wenn ich ändern, um die Schaffung des Select zu:
this.CareerLevels = new SelectList(repository.GetAllCareerLevels(), vacature.CareerLevels);
Also ohne die „ID“ und „Name“ es ebenfalls nicht retten (ich denke, es ist immer noch als String in der post-Methode zurückgegeben wird, und nicht der Objekt selbst) und neben diesem, es listet in der Ansicht als: vacature.EducationLevels usw. Also nicht die Namen, sondern das Objekt selbst aufgeführt ist.
Letzte Frage Also, kurz gesagt, meine Frage ist, ob es möglich ist, diesen Ansatz zu verwenden, um meine branche, educationallevel und careerlevel gesetzt. Also nicht automatisch?
In diesem Fall muss ich noch Dinge verwenden wie:
[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);
}
In meinem Controller? Oder gibt es andere, glattere Optionen.
Das Problem ist, dass ich meine EducationLevelID nicht ein int (wie von Dropdown-Liste unterstützt wird?), Sondern eine GUID, die nicht sofort unterstützt wird. Sie müssen die GUID aus der Rückgabe der Dropdown-Liste selbst generieren, soweit ich weiß. Was bedeutet, dass ich noch die Schritte machen muss, die ich vorher gemacht habe. – bastijn
Ich habe überprüft und die Guid ist kein Problem. Der bearbeitete Code verwendet IEnumerable, aber es sollte keinen Unterschied zu SelectList geben –
Also, wie ist die Dropdown-Liste mit 'EducationLevelID', um das ausgewählte Element entsprechend anzuzeigen? – Remus