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