ASP.NET MVC - 下拉列表选择 - 部分视图和模型绑定

时间:2011-03-04 01:07:38

标签: asp.net-mvc razor partial-views model-binding

我是ASP.NET MVC的新手,我正在努力找到最好的方法来实现这一目标。这可能很简单,但我只是想做正确的事,所以我想我会问。

让我说我有一个这样的模型:

任务 - ID,描述,AssignedStaffMember

StaffMember - Id,FirstName,LastName

在我看来我想创建一个新任务。我创建了一个强类型的Razor视图,可以使用EditorFor为Description创建文本框但是AssignedStaffMember呢?

我想要一个当前所有员工的下拉列表,并且可以选择一个,然后将其提交给一个动作方法,即 NewTask(string description, StaffMember assignedStaffMember) 或者我可以为staffId而不是StaffMember对象使用int,并在action方法中查找它。

最好的方法是什么?我需要去数据库以获取员工名单,所以这就是我的想法:

  1. 对员工下拉列表进行部分查看,将使用几次并使用@Html.Action("ListStaff", "Staff")来调用它。然后动作方法有

    public ActionResult ListStaff()
    {
        IEnumerable<StaffMember> model = _serviceLayer.GetAllStaff();
        return PartialView(model);
    }
    

    但是我不确定这将如何与模型绑定一起使用,我的理解是它必须有正确的名称才能提交表单,我需要将名称传递给局部视图才能放入关于元素,我猜?

  2. 不要让它调用控制器来获取工作人员,而是创建一个包含我的Task和IEnumerable possibleStaff集合的ViewModel。可能会将此信息发送到局部视图。

  3. 一个Html助手?

  4. 编辑器可以以某种方式使用?

  5. 哪一个(或者更多)最好?以及如何进行模型绑定?

1 个答案:

答案 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)