在ASP.NET MVC中批处理多个DropDownList

在ASP.NET MVC中批处理多个DropDownList,.net,asp.net-mvc,model-binding,.net,Asp.net Mvc,Model Binding,我有一个视图,它输出一个项目表,每个项目都有一个单元格,其中有一个员工下拉列表。让我们称之为项目负责人 它预填充列表并选择当前项目负责人。然后,用户可以通过下拉菜单选择一个新的。还有另一个值的下拉列表,我们称之为代理 即: 项目#-DropDownList1-DropDownList2 项目#-DropDownList1-DropDownList2 (编辑:查看此图片查看我的视图,项目编号,然后是领导,然后是副手。下拉列表设置为当前值,但将更改,并单击页面底部的提交按钮(不在图片中) 另外还有

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

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

即: 项目#-DropDownList1-DropDownList2 项目#-DropDownList1-DropDownList2

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

另外还有一个默认值“需要更新”,该值是在担任领导/副手的员工离开公司时设置的(他们的姓名不再在列表中,因此默认为该姓名)

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

我的问题是,就行动方法而言,这是如何工作的?我已将每个下拉列表命名为ProjectLeader(项目负责人)和ProjectSubstance(项目代理),其中Projectd(项目负责人)是数字

@Html.DropDownList(
                     "ProjectLeader" + item.Project.ProjectId,
                       new SelectList(item.AllStaff, "StaffId", "FullName",
                          item.Project.Leader.StaffId),
                           "NEEDS UPDATING!",
                          new { className = "Nominated" }
                     )
因此,当我提交该表单时,我的post值是

ProjectLeader254=2&ProjectDeputy254=5&ProjectLeader255=6

我如何在我的行动方法中处理这个问题?理想情况下,我会有一本项目字典:领导人和副手的员工成员 即

[HttpPost]
公共行动结果更新通知(IDictionary
项目负责人、IDictionary项目代表)
或者可能只是两者的int-int字典,ProjectId作为键,StaffId作为值,因为我可能无论如何都要在数据库中查找它们

编辑:这是我当前的视图模型

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

}
公共类项目负责人更新视图模型
{
公共项目{get;set;}
公共bool LeaderCompleted{get;set;}
公共bool DeputyCompleted{get;set;}
公共IEnumerable AllStaff{get;set;}
}

我猜我需要创建一个自定义模型绑定?有人能给我一些建议吗?在这种情况下,我会创建一个视图模型来表示单个项目。我假设一个项目有一个
领导
副手
和一个
老领导

视图模型:

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!") %>
<% } %>
默认的模型绑定器应该为您将表单数据绑定到视图模型

根据评论更新 您可以非常轻松地将ViewModels列表绑定到:

表格部分:

~/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!") %>
~/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.
}
public ActionResult Edit(){
var projects=ProjectRepository.All();
返回视图(项目);
}
[HttpPost]
公共行动结果编辑(ICollection){
//希望集合将包含所有绑定的视图模型对象。
}

请注意,这些都是未经检查而键入的,因此可能会有一些错误。

主要问题是我有多个下拉列表,正在尝试将它们全部批处理,请参阅我的帖子我添加了视图的屏幕截图以及当前ViewModel的代码。关于如何使您的方法适用于多个视图模型,我有什么想法吗?我已经更新了我的答案,包括一些绑定视图模型集合的内容。此处有更多资源:@RodH257:默认modelbinder也可以绑定到集合。请参阅类型为
ICollection
的操作参数。发布表单时,您应该获得
Project
对象的集合。
<%@ 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!") %>
<%@ Page Inherits="ViewPage<IList<ProjectLeaderUpdateViewModel>>" %>

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