2009-06-24 8 views
0

Ich kann nicht scheinen, den Wert einer Auswahlliste zu erhalten, um den Wert des Elternobjekts aufzufüllen. Ich verwende ein Wrapper-Objekt zum Binden, damit ich Zugriff auf die Werte habe, die für die SelectList benötigt werden, sowie auf das Objekt, das den Wert benötigt. Ich wette, ich vermisse etwas Grundlegendes, aber ich kann es nicht finden.Suchlisten mit NHibernate und ASP.Net MVC

Ich habe diese Modelle:

public class Status 
    { 
     public virtual int Id { get; protected set; } 
     public virtual string Name { get; set; } 
     public virtual bool IsClosed { get; set; } 

     public override string ToString() 
     { 
      return Name; 
     } 
    } 
    public class Issue 
    { 
     public virtual int Id { get; protected set; } 
     public virtual string Title { get; set; } 
     public virtual string Description { get; set; } 
     public virtual Status Status { get; set; } 
     public virtual DateTime CreatedOn { get; set; } 
     public virtual DateTime UpdatedOn { get; set; } 

    } 

Und ein FormViewModel (von NerdDinner Beispiele), die Liste der Status enthalten

public class IssueFormViewModel 
    { 
     public Issue Issue { get; set; } 
     public SelectList Statuses { get; set; } 
     public IssueFormViewModel(Issue issue, IList<Status> statuses) 
     { 
      Issue = issue; 
      Statuses = new SelectList(statuses, "Id", "Name", statuses[1].Id); 
     } 

     public IssueFormViewModel() { } 

    } 

Aktionen auf dem Controller-Look Mein wie ...

public ActionResult Create() 
    { 
     IList<Status> statuses; 
     Issue issue = new Issue(); 
     // NHibernate stuff getting a List<Status> 
     return View(new IssueFormViewModel(issue,statuses)); 
    } 
    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(IssueFormViewModel issueFormView) 
    { // At this point issueFormView.Issue.Status == null 
     // ... 
    } 

Mein Issue-Objekt ist teilweise gebunden, mit Ausnahme des Status, in dem diese Namen verwendet werden die Aussicht:

<p> 
      <label for="Issue.Title">Title:</label> 
      <%= Html.TextBox("Issue.Title", Model.Issue.Title)%> 
      <%= Html.ValidationMessage("Title", "*") %> 
     </p> 
<p> 
      <label for="Statuses">Status:</label> 
      <!-- also tried "Issue.Status" --> 
      <%= Html.DropDownList("Statuses", Model.Statuses)%> 
      <%= Html.ValidationMessage("Status", "*")%> 
     </p> 

Antwort

0

Wie erwartet - es war etwas einfaches.

änderte ich die Ansicht aussehen:

<label for="Status.Id">Status:</label> 
    <%= Html.DropDownList("Status.Id", Model.Statuses)%> 
    <%= Html.ValidationMessage("Status.Id", "*")%> 

und die Steuerung Unterschrift ein „Problem“ nehmen (nicht auf eine Select binden!)

[AcceptVerbs(HttpVerbs.Post)] 
    //public ActionResult Create(IssueFormViewModel issueFormView) 
    public ActionResult Create(Issue issueToAdd) 
    { 

Und in meinem Beitrag -Create Aktion Ich habe ein Problem mit einem Status. Obwohl der Status ungültig ist (er enthält nur die ID). Also, bevor die Ausgabe an die DB commiting, stelle ich die issueToAdd wie folgt aus:

issueToAdd.Status = (from p in GetAllStatuses() 
         where p.Id == issueToAdd.Status.Id 
         select p).First(); 

Edit: Und es stellt sich heraus, dass ich brauchte nicht einmal eine „richtige“ Statusobjekt zu holen. Es ist an Id gebunden und das ist gut genug.

0

habe ich versucht, die Dropdown-Liste auf meinem Computer und es funktioniert, sollten Sie sicherstellen NHibernate machen bringt wieder mehr als 1 Einzelteil als Ihr Code versucht, das ausgewählte Element zu setzen das zweite Element zu sein.

Statuses = new SelectList(statuses, "Id", "Name", statuses[1].Id); 

Denken Sie daran, Listet eine auf Null basierende indexierte.

+0

Guter Fang, aber ich bekam keine OutOfBounds Ausnahme. Ich garantierte, dass ich mehr als einen Wert zum Testen hatte. – hometoast