从HTML.DropDownList中获取选定值返回给控制器(.Net MVC)
问题描述:
在MVC应用程序中,我有一个显示任务的视图。这些任务应由其所分配的员工过滤。员工将显示在下拉列表中。从HTML.DropDownList中获取选定值返回给控制器(.Net 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();"
})
}
我有一个TaskController有一个ActionResult,从形式获取数据:
[HttpPost]
public ActionResult EmployeeDropUsed(int id)
{
Employee e = er.GetById(id);
return LoadControls(er.GetAll(), e.Tasks.ToList());
}
视图模型看起来像这样
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; }
}
是我不的问题知道如何将选定的值从回退到控制器。我试图在模型中使用DropDownListFor和雇员属性:
@Html.DropDownListFor(m => Model.EmployeeId, Model.Employees, "Select Employee")
public int EmployeeId { get; set; }
结果是ID始终是0
答
的问题是,你的EmployeeDropUsed
行动正在寻找一个名为id
的参数和参数你发送它是EmployeeId
。请将EmployeeDropUsed
操作上的参数名称更改为employeeId
,或将TaskModel
上的EmployeeId
属性更改为id
。
如果更改TaskModel
属性这应该工作:
@Html.DropDownListFor(m => m.id, Model.Employees, "Select Employee")
如果更改EmployeeDropUsed
参数这应该工作:
@Html.DropDownListFor(m => m.EmployeeId, Model.Employees, "Select Employee")
答
是不是lambda表达式不正确有关系吗?它不应该是
@Html.DropDownListFor(m => m.EmployeeId ....
,而不是
@Html.DropDownListFor(m => Model.EmployeeId
+0
好抓住,当我被复制时没有注意到那部分/从问题粘贴。 – 2012-04-18 14:30:51
太好了!如果我将所有ID更改为EmployeeId,它就可以工作。我仍然不明白为什么,但谢谢! – AGuyCalledGerald 2012-04-18 14:01:51
MVC中的默认模型绑定采用表单值,路由值和查询字符串值,并将它们映射到您的操作中的参数。为了正常工作,名称必须匹配。在这种情况下,您的视图正在创建一个名为EmployeeId的表单值。模型绑定在名为EmployeeId的操作中没有找到任何参数,所以它忽略了它。一旦您将参数重命名为与表单值匹配,就会找到并为您设置。这里是一个体面的文章模型绑定:http://dotnetslackers.com/articles/aspnet/Understanding-ASP-NET-MVC-Model-Binding.aspx – 2012-04-18 14:16:32