2009-06-24 71 views
0

我似乎无法获得选择列表的值来填充父对象的值。 我正在使用一个包装器对象进行绑定,以便我可以访问SelectList所需的值以及需要该值的对象。 我愿意赌我错过了一些基本的东西,但我找不到它。使用NHibernate和ASP.Net查找列表MVC

我有这些模型:

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

    } 

而一个FormViewModel(从的NerdDinner示例)包含以下状态

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

    } 

的名单我在控制器上创建看起来像行动...

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

我的问题对象绑定部分除了使用这些名称的状态查看:

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

回答

0

正如所料 - 它有些简单。

我改变了看法,看起来像:

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

和控制器签名采取“问题”(不能绑定到一个选择列表的!)

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

在我的帖子 - 创建行动我有一个状态问题。虽然状态是无效的(它只包含Id)。所以commiting问题的分贝之前,我设置了issueToAdd这样的:

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

编辑:而事实证明,我甚至没有需要获取一个“正确”的状态对象。这肯定是Id,这很好。

0

我想我的电脑上的下拉列表和它的作品,你应该确保NHibernate的被带回超过1项作为你的代码试图设置所选择的项目是第二个项目。

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

请记住,列出一个基于重新索引的零。

+0

良好的捕获,但我没有得到一个OutOfBounds异常。为了测试,我保证我有超过1个值。 – hometoast 2009-06-24 19:25:23