我有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; }
}
我有一个ViewModel:
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
- 它没有所有者的价值(列表已正确填充)
- ViewModel的人也为无效
使用ViewModel的重点是从视图到控制器的携带信息,所以首先是为什么人们为null。
其次,最重要的是,为什么在地球上没有得到正确人口的人口。有些人可供选择。事件名称将通过模型传递,以使ViewModel在某种程度上工作...
谢谢,
首先,应该是:
@Html.DropDownListFor(x => x.EventToEdit.Owner.ID, Model.People)
这样的模型。人是这样的:
new SelectList(source, "ID", "Name", source.ID)
检查HTML以查看HTML中选项元素的值中放置的内容,我怀疑MVC不能将此值投入EventToEdit.Owner
,因为我认为它只能处理字符串和整数虽然如果需要使用另一个数据类型,则可以为此编写自定义模型。
ASP.NET不会发布用于填充下拉列表以提高效率的值(请参阅此处)。
。我个人发现下拉列表不是很有帮助,它们旨在直接从数据库显示数据,因此您可以根据需要重新查询以获取控制器中的SelectList值并将其链接回去通过将简单的ID放置在选项值中。
采取Karaxuna的答案:
首先,应该是:
@Html.DropDownListFor(x => x.EventToEdit.Owner.ID, Model.People)
这样的模型。人是这样的:
new SelectList(source, "ID", "Name", source.ID)
并在此上扩展:
新ViewModel:
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);
我为清晰而写下这个答案,任何来搜索的人都可能喜欢查看完整的页面。