0

我似乎无法获取选择列表的值来填充父对象的值。我正在使用一个包装器对象进行绑定,以便我可以访问 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>
4

2 回答 2

0

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

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

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

于 2009-06-24T19:14:55.663 回答
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)。因此,在将问题提交到数据库之前,我将 issueToAdd 设置为:

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

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

于 2009-06-24T19:24:30.120 回答