2011-03-04 68 views
5

我对ASP.NET MVC相当陌生,并且正在尝试找出实现此目的的最佳方法。这可能很简单,但我只是想正确地做事,所以我想我会问。ASP.NET MVC - 下拉列表选择 - 部分视图和模型绑定

可以说我有一个模型,它是这样的:

任务 - ID,描述,AssignedStaffMember

StaffMember - 身份证,名字,姓氏

在我看来,我想创建一个新的任务。我创建了一个强类型的Razor视图,并且可以使用EditorFor为描述创建文本框,但AssignedStaffMember怎么样?

我希望有一个下拉当前所有工作人员的名单,并有选择一个,那么这个被提交到这是 NewTask(string description, StaffMember assignedStaffMember) 要么我也可以有,STAFFID代替StaffMember对象的int操作方法的选择并在动作方法中查找它。

这样做的最好方法是什么?我需要去到数据库以获取列表关的工作人员,所以这里就是我想:

  1. 做一个局部视图为员工下拉的上市,这将用过几次,并使用@Html.Action("ListStaff", "Staff")来叫它。操作方法则有

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

    但是我不知道这是如何将与模型绑定工作,我的理解是,它必须有正确的名称为表单提交它,我需要将名称传递给部分视图以将其放在元素上我猜?

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

  3. 一个Html Helper?

  4. EditorFor可能以某种方式被使用?

哪一个(或更多)会是最好的?以及我将如何做模型绑定?

+0

+1你用过描述您的问题:) – 2014-06-25 14:23:00

回答

17

以下是一种方法。创建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); 
} 

在View(强烈地结合到TaskDetailsViewModel)

@Html.DropDownListFor(model => model.Task.AssignedStaffMember, new SelectList(Model.StaffMembers, "ID", "FirstName", Model.Task.AssignedStaffMember)) 
@Html.ValidationMessageFor(model => model.Task.AssignedStaffMember) 
+0

感谢这个很好的例子,我倾向于尝试这种方式。我有一个问题,但。它似乎没有在Edit post方法中正确绑定下拉列表 - AssignedStaffMember始终为空。让我想到,一旦我绑定了数据库,我仍然需要在数据库中查找该工作人员,因为即使它工作,我也只有一个空的工作人员,除了它的ID不是我吗?这不太有用。所以也许我应该单独接受参数? – RodH257 2011-03-04 04:42:07

+0

伟大的答案!!!! – 2011-03-04 10:54:08