我是ASP.NET MVC的新手,我正在努力找到最好的方法来实现这一目标。这可能很简单,但我只是想做正确的事,所以我想我会问。
让我说我有一个这样的模型:
任务 - ID,描述,AssignedStaffMember
StaffMember - Id,FirstName,LastName
在我看来我想创建一个新任务。我创建了一个强类型的Razor视图,可以使用EditorFor为Description创建文本框但是AssignedStaffMember呢?
我想要一个当前所有员工的下拉列表,并且可以选择一个,然后将其提交给一个动作方法,即
NewTask(string description, StaffMember assignedStaffMember)
或者我可以为staffId而不是StaffMember对象使用int,并在action方法中查找它。
最好的方法是什么?我需要去数据库以获取员工名单,所以这就是我的想法:
对员工下拉列表进行部分查看,将使用几次并使用@Html.Action("ListStaff", "Staff")
来调用它。然后动作方法有
public ActionResult ListStaff()
{
IEnumerable<StaffMember> model = _serviceLayer.GetAllStaff();
return PartialView(model);
}
但是我不确定这将如何与模型绑定一起使用,我的理解是它必须有正确的名称才能提交表单,我需要将名称传递给局部视图才能放入关于元素,我猜?
不要让它调用控制器来获取工作人员,而是创建一个包含我的Task和IEnumerable possibleStaff集合的ViewModel。可能会将此信息发送到局部视图。
一个Html助手?
编辑器可以以某种方式使用?
哪一个(或者更多)最好?以及如何进行模型绑定?
答案 0 :(得分:18)
这是一种方法。创建TaskDetailsViewModel
public class TaskDetailsViewModel
{
public TaskDetailsViewModel()
{
this.Task = new Task();
this.StaffMembers = new List<StaffMember>();
}
public Task Task { get; set; }
public IEnumerable<StaffMember> StaffMembers { get; set; }
}
在控制器
中public ActionResult Edit(int id)
{
var task = taskRepository.GetTaskByID(id);
var taskDetailsViewModel = new TaskDetailsViewModel();
// Populate taskDetailsViewModel from task and staff
return View(taskDetailsViewModel);
}
[HttpPost]
public ActionResult Edit(TaskDetailsViewModel taskDetailsViewModel)
{
if (ModelState.IsValid)
{
taskRepository.Save(taskDetailsViewModel.Task);
}
else
{
// Show Error
}
return View(taskDetailsViewModel);
}
在视图中(强烈绑定到TaskDetailsViewModel)
@Html.DropDownListFor(model => model.Task.AssignedStaffMember, new SelectList(Model.StaffMembers, "ID", "FirstName", Model.Task.AssignedStaffMember))
@Html.ValidationMessageFor(model => model.Task.AssignedStaffMember)