使用NHibernate和ASP.Net MVC查找列表

时间:2009-06-24 18:35:46

标签: asp.net-mvc nhibernate drop-down-menu selectlist

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

我有这些模特:

    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>

2 个答案:

答案 0 :(得分:0)

我在我的计算机上尝试了下拉列表并且它有效,你应该确保NHibernate带回了多于1个项目,因为你的代码试图将所选项目设置为第二项。

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

请记住,列出基于零的索引。

答案 1 :(得分: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)
    {

在我的Post-Create操作中,我遇到状态问题。虽然状态无效(它只包含Id)。所以在将问题提交给db之前,我将issueToAdd设置为:

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

编辑:事实证明我甚至不需要获取“正确”的Status对象。它与Id绑定,这已经足够了。