2009-06-24 4 views
0

Je n'arrive pas à obtenir la valeur d'une liste de sélection pour remplir la valeur de l'objet parent. J'utilise un objet wrapper à lier afin que j'aie accès aux valeurs nécessaires pour SelectList ainsi que l'objet qui a besoin de la valeur. Je suis prêt à parier qu'il me manque quelque chose de basique mais je ne le trouve pas.Listes de recherche avec NHibernate et ASP.Net MVC

Je ces modèles:

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; } 

    } 

et un FormViewModel (des exemples de NerdDinner) pour contenir la liste des Statuses

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() { } 

    } 

Mon Créer Actions sur le regard du contrôleur comme ...

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 
     // ... 
    } 

Mon objet Problème est lié partiellement, sauf le statut utilisant ces noms dans la vue:

<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> 

Répondre

0

Comme prévu - c'était quelque chose de simple.

j'ai changé en vue de ressembler à:

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

et la signature du contrôleur de prendre un "problème" (ne peut pas se lier à un SelectList!)

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

Et dans mon post -Créer une action J'ai un problème avec un statut. Bien que le statut soit invalide (il contient seulement l'identifiant). Donc, avant de valider la question à la DB, je mets le issueToAdd comme ceci:

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

Edit: Et il se trouve que je ne même pas besoin de chercher un objet d'état « approprié ». C'est lié à Id et c'est assez bon.

0

J'ai essayé la liste déroulante sur mon ordinateur et il fonctionne, vous devez vous assurer NHibernate ramène plus de 1 article que votre code tente de définir l'élément sélectionné pour le deuxième élément.

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

Rappelez-vous que Répertorie une base zéro indexée.

+0

Bonne capture, mais je n'obtenais pas une exception OutOfBounds. Je garantissais que j'avais plus d'une valeur pour les tests. – hometoast