批量处理ASP.NET MVC中的许多下拉列表

时间:2011-11-22 05:05:27

标签: .net asp.net-mvc model-binding

我有一个视图,它输出一个项目表,每个项目都有一个单元格,其中有一个工作人员下拉列表。让我们称之为项目负责人。

预填充列表并选择当前项目负责人。然后,用户可以通过下拉列表选择一个新的。还有另一个值的下拉列表,让我们称之为代理

即: Project# - DropDownList1 - DropDownList2 Project# - DropDownList1 - DropDownList2

(编辑:请参阅此图片查看我的视图,项目编号,然后是领导者,然后是副手。下拉菜单设置为当前值,但将被更改并点击页面底部(不是图片中)的提交按钮) mvc view

还有一个默认值'需要更新'当一名领导/副手的工作人员离开公司时(其名称不再在列表中,因此默认为该名称)时设置。

我想要做的是,有一个提交按钮,所以用户通过并选择新值,然后点击提交。然后将它们发布到服务器以进行更新。

我的问题是,这在行动方法方面如何运作?我已将每个下拉列表命名为ProjectLeader#PROJECTID#和ProjectDeputy#PROJECTID#,其中#PROJECTID#是数字。

@Html.DropDownList(
                     "ProjectLeader" + item.Project.ProjectId,
                       new SelectList(item.AllStaff, "StaffId", "FullName",
                          item.Project.Leader.StaffId),
                           "NEEDS UPDATING!",
                          new { className = "Nominated" }
                     )

因此,当我提交该表单时,我的帖子值与

一致
ProjectLeader254=2&ProjectDeputy254=5&ProjectLeader255=6

如何在我的动作方法中处理此问题?希望我有一个项目词典:领导和代表的职员 即

 [HttpPost]
    public ActionResult UpdateNominations(IDictionary<Project, StaffMember>
        projectLeaders, IDictionary<Project, StaffMember> projectDeputies)

或者可能只是两者的int-int字典,其中ProjectId作为键,StaffId作为值,因为我可能无论如何都要在数据库中查找它们。

编辑:这是我当前的ViewModel

    public class ProjectLeaderUpdateViewModel
{
    public Project Project{ get; set; }
    public bool LeaderCompleted { get;set; }
    public bool DeputyCompleted{ get;set;}
    public IEnumerable<StaffMember> AllStaff { get; set; } 

}

我猜我是否需要创建自定义模型绑定?谁能给我一些关于我应该怎么做的建议呢?

1 个答案:

答案 0 :(得分:2)

我在这种情况下创建一个ViewModel来表示一个项目。我假设某个项目只有一个LeaderDeputyOldLeader

视图模型:

public class Project {
    public int Leader { get; set; }
    public int Deputy { get; set; }
    public int OldLeader { get; set; }

    // Add more properties as required.
}

我假设你有办法获得所有员工的对象。视图Edit.aspx

<% using (Html.BeginForm()) { %>
    <%= Html.DropDownListFor(p => p.Leader, new SelectList(StaffRepository.AllStaff, "StaffId", "FullName")) %>
    <%= Html.DropDownListFor(p => p.Deputy, new SelectList(StaffRepository.AllStaff, "StaffId", "FullName")) %>
    <%= Html.DropDownListFor(p => p.OldLeader, new SelectList(StaffRepository.AllStaff, "StaffId", "FullName"), "Needs updating!") %>
<% } %>

控制器:

public ActionResult Edit(int id) {
    // Get the project you're editing. Do this with whatever method you're already using - EF4, NHibernate etc.
    Project p = ProjectRepository.GetById(id);
    return View(p);
}

[HttpPost]
public ActionResult Edit(Project p) {
    // p should have it's properties bound by the default model binder.
}

默认模型绑定器应该将表单数据绑定到视图模型。

按评论更新

您可以非常轻松地将ViewModel列表绑定到:

表格部分:

~/Shared/EditorTemplates/ProjectLeaderUpdateViewModel.ascx

<%@ Control Inherits="ViewUserControl<ProjectLeaderUpdateViewModel>" %>
<%= Html.HiddenFor(p => p.Project.ProjectId) %>
<%= Html.DropDownListFor(p => p.Project.Leader.StaffId, new SelectList(p.AllStaff, "StaffId", "FullName")) %>
<%= Html.DropDownListFor(p => p.Project.Deputy.StaffId, new SelectList(p.AllStaff, "StaffId", "FullName")) %>
<%= Html.DropDownListFor(p => p.Project.OldLeader.StaffId, new SelectList(p.AllStaff, "StaffId", "FullName"), "Needs updating!") %>

~/Views/Edit.aspx

<%@ Page Inherits="ViewPage<IList<ProjectLeaderUpdateViewModel>>" %>

<% using (Html.BeginForm()) { %>
    <% for (int i = 0; i < Model.Data.Count; i++) { %>
        <%= Html.EditorFor(p => p[i]) %>
    <% } %>
<% } %>

~/Controllers/ProjectController.cs

public ActionResult Edit() {
    var projects = ProjectRepository.All();
    return View(projects);
}

[HttpPost]
public ActionResult Edit(ICollection<ProjectLeaderUpdateViewModel>) {
    // Hopefully, collection will contain all the bound view model objects.
}

请注意,这些都是在没有检查的情况下打印出来的,因此可能会出现一些错误。