2009-06-26 6 views
0

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.

Antwort

2

Edited Guid zu verwenden:

Mit Dropdownlists verwende ich einen etwas anderen Ansatz. Es könnte möglich sein, Ihr Ansichtsmodell zum Laufen zu bringen, aber für mich ist es einfacher, auf diese Weise:

public class VacaturesFormViewModel 
{ 

    public IEnumerable<SelectListItem>EducationLevels{ get; set; } 
    public Guid EducationLevelID{ get; set; } 

} 

Die EducationLevelID die ausgewählte ID Ihren Dropdown haben. Dies ist die Ansicht:

<%= Html.DropDownList("EducationLevelID", Model.EducationLevels)%> 

-Controller

IEnumerable<SelectListItem> educationLevelList = 
          from level in GetLevelList() 
          select new SelectListItem 
          { 
           Text = level .Name, 
           Value = level.Uid.ToString() 
          }; 
    model.EducationLevels = educationLevelList ; 
+0

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

+1

Ich habe überprüft und die Guid ist kein Problem. Der bearbeitete Code verwendet IEnumerable , aber es sollte keinen Unterschied zu SelectList geben –

+0

Also, wie ist die Dropdown-Liste mit 'EducationLevelID', um das ausgewählte Element entsprechend anzuzeigen? – Remus

1

Ich bin nicht sicher, aber ich denke, Sie sollten Modellbinder erstellen. (David Hayden schrieb ein einfaches Modell Binder)

+0

Dies ist auch ein Beispiel für String nur basierte Informationen. Wie er verwendet: HttpContext.Request.Formularname"]; Was genau in meinem Fall schief geht, das gibt mir kein Objekt, sondern eine Saite. Nicht sicher, obwohl. – bastijn

+0

Auf der zweiten Hand könnte dies tatsächlich funktionieren als: > Blockquote "Sie können Ihre eigenen benutzerdefinierten Modellbinder für Kunden erstellen, die eine neue Kundeninstanz instanziiert und fügt die entsprechenden Formularwerte zu den verschiedenen Kundeneigenschaften" klingt vielversprechend. – bastijn

1

Sie educationID Parameter automatisch binden können:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Create(Guid? educationID, FormCollection form) 
{ 
    Vacatures vacatureToAdd = new Vacatures(); 

    if (educationID != null) 
    { 
     vacatureToAdd.EducationLevels = 
      repository.GetEducationLevelByID(educationID.Value); 
    } 
Verwandte Themen