2012-04-18 71 views
3

在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

回答

2

的问题是,你的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") 
+0

太好了!如果我将所有ID更改为EmployeeId,它就可以工作。我仍然不明白为什么,但谢谢! – AGuyCalledGerald 2012-04-18 14:01:51

+0

MVC中的默认模型绑定采用表单值,路由值和查询字符串值,并将它们映射到您的操作中的参数。为了正常工作,名称必须匹配。在这种情况下,您的视图正在创建一个名为EmployeeId的表单值。模型绑定在名为EmployeeId的操作中没有找到任何参数,所以它忽略了它。一旦您将参数重命名为与表单值匹配,就会找到并为您设置。这里是一个体面的文章模型绑定:http://dotnetslackers.com/articles/aspnet/Understanding-ASP-NET-MVC-Model-Binding.aspx – 2012-04-18 14:16:32

5

是不是lambda表达式不正确有关系吗?它不应该是

@Html.DropDownListFor(m => m.EmployeeId .... 

,而不是

@Html.DropDownListFor(m => Model.EmployeeId 
+0

好抓住,当我被复制时没有注意到那部分/从问题粘贴。 – 2012-04-18 14:30:51

相关问题