Asp.net mvc 3 从HTML.DropDownList返回控制器(.Net MVC)的选定值

Asp.net mvc 3 从HTML.DropDownList返回控制器(.Net MVC)的选定值,asp.net-mvc-3,Asp.net Mvc 3,在MVC应用程序中,我有一个显示任务的视图。任务应按分配给他们的员工进行筛选。员工将显示在下拉列表中 @using (Html.BeginForm("EmployeeDropUsed", "Task", new { id = ?? })) { @Html.DropDownList( "EmployeeDrop", new SelectList(Model.Employees, "Id", "EmployeeName"), "Select employee",

在MVC应用程序中,我有一个显示任务的视图。任务应按分配给他们的员工进行筛选。员工将显示在下拉列表中

@using (Html.BeginForm("EmployeeDropUsed", "Task", new { id = ?? }))
{
    @Html.DropDownList(
        "EmployeeDrop", new SelectList(Model.Employees, "Id", "EmployeeName"), "Select employee",
        new
        {
            onchange = @"
            var form = document.forms[0]; 
            form.submit();"
        })
}
我有一个带有ActionResult的TaskController,从表单中获取数据:

[HttpPost]
public ActionResult EmployeeDropUsed(int id)
{
    Employee e = er.GetById(id);
    return LoadControls(er.GetAll(), e.Tasks.ToList());
}
ViewModel如下所示

public class TaskModel
{
    public TaskModel(List<Employee> employees, List<Task> tasks)
    {
        Employees = employees;
        Tasks = tasks;
    }

    public List<Task> Tasks { get; set; }
    public List<Employee> Employees { get; set; }
}

结果是id始终为0。

问题是您的
EmployeeDropUsed
操作正在查找名为
id
的参数,并且您发送它的参数是
EmployeeId
。将
EmployeeDropUsed
操作上的参数名称更改为
employeeId
,或将
TaskModel
上的
employeeId
属性更改为
id

如果更改了
TaskModel
属性,则应该可以:

@Html.DropDownListFor(m => m.id, Model.Employees, "Select Employee")
@Html.DropDownListFor(m => m.EmployeeId, Model.Employees, "Select Employee")
如果您更改
EmployeeDropUsed
参数,则该参数应起作用:

@Html.DropDownListFor(m => m.id, Model.Employees, "Select Employee")
@Html.DropDownListFor(m => m.EmployeeId, Model.Employees, "Select Employee")

但是,lambda表达式不是不正确吗?难道不是吗

@Html.DropDownListFor(m => m.EmployeeId ....
而不是

@Html.DropDownListFor(m => Model.EmployeeId

伟大的如果我将所有id更改为EmployeeId,它会起作用。我还是不明白为什么,但是谢谢!MVC中的默认模型绑定采用表单值、路由值和查询字符串值,并将它们映射到操作中的参数。要使其正常工作,所有名称都必须匹配。在这种情况下,您的视图正在创建一个名为EmployeeId的表单值。模型绑定在名为EmployeeId的操作上找不到任何参数,因此将其忽略。重命名参数以匹配表单值后,它会找到它并为您进行设置。这里有一篇关于模型绑定的不错的文章:很好,当我从问题中复制/粘贴时,我并没有注意到这一部分。