2

我有 2 个型号:

public class Person
{
    public Guid ID { get; set; }
    public string Name { get; set;}
}

public class Event
{
    public Guid ID { get; set; }
    public string EventName { get; set; }
    public virtual Person Owner { get; set; }
}

我有一个视图模型:

public class EventViewModel
{
     public EventViewModel() { }
     public Event EventToEdit { get; set; }
     public SelectList People { get; set; }
}

我有我的控制器:

public ViewResult Create()
{
     var eve = new Event();
     var vm = new EventViewModel
                 {
                     EventToEdit = eve,
                     People = GetPeopleList(true, eve)
                 }
     return View(vm)
 }

我有我的看法:

@Html.DropDownListFor(x => x.EventToEdit.Owner, Model.People)

很明显,它们是为了阅读目的而被删减的。

当我提交我的视图并在ActionResult Create

  1. 它没有 Owner 的值(列表已正确填充)
  2. ViewModel People 也为空

使用 ViewModel 的目的是将信息传递到视图和从视图传递到控制器,所以首先为什么 People 为空。

其次,也是最重要的,为什么所有者没有得到适当的填充。有可供选择的人。事件名称将通过模型传回,因此 ViewModel 有点工作......

谢谢,

4

3 回答 3

4

首先,它应该是:

@Html.DropDownListFor(x => x.EventToEdit.Owner.ID, Model.People)

所以 Model.People 是这样的:

new SelectList(source, "ID", "Name", source.ID)
于 2012-12-19T10:56:30.980 回答
2

检查 HTML 以查看 HTML 中选项元素的值中放置了什么,我怀疑 MVC 无法将此值转换EventToEdit.Owner为,因为我认为它只能处理字符串和整数,但如果需要,您可以为此编写自定义模型绑定器使用另一种数据类型。

ASP.Net 不会回发用于填充下拉列表以提高效率的值(请参阅此处)。

就我个人而言,我发现下拉列表不是很有帮助,它们旨在直接显示数据库中的数据,因此您可以根据需要重新查询以获取控制器中的 SelectList 值并将它们链接回此重新- 通过在选项值中放置简单的 ID 来查询列表。

于 2012-12-19T10:59:16.250 回答
1

以karaxuna的回答:

首先,它应该是:

@Html.DropDownListFor(x => x.EventToEdit.Owner.ID, Model.People)

所以 Model.People 是这样的:

new SelectList(source, "ID", "Name", source.ID)

并对此进行扩展:

新视图模型:

public class EventViewModel
{
    public EventViewModel() { }
    public Event EventToEdit { get; set; }
    public SelectList People { get; set; }
    public Guid SelectedPerson { get; set; }
}

视图绑定:

@Html.DropDownListFor(x => x.SelectedPerson, Model.People)

然后在控制器中:

var person = _repository.People.FirstOrDefault(x => x.ID.CompareTo(vm.SelectedPerson) == 0);
vm.EventToEdit.Person = person;
_repository.SaveEvent(vm.EventToEdit);

为了清楚起见,我写了这个答案,任何来搜索的人都可能更喜欢看到完整的页面。

于 2012-12-19T13:30:08.210 回答