2012-04-18 4 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()); 
} 

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; } 
} 

Проблема в том, я не знаю, как чтобы получить выбранное значение от возврата к контроллеру. Я попытался с помощью DropDownListFor и свойство EmployeeID в модели:

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

public int EmployeeId { get; set; } 

Результат является то, что идентификатор всегда равен 0.

ответ

2

Проблема заключается в том, что ваше EmployeeDropUsed действия ищет параметр с именем id и параметр, который вы посылаем это EmployeeId. Либо измените имя параметра на действие EmployeeDropUsed на employeeId, либо измените свойство EmployeeId на TaskModel на id.

Если изменить TaskModel свойства это должно работать:

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

При изменении параметра EmployeeDropUsed это должно работать:

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

Отлично! Если я изменю идентификатор на EmployeeId, он будет работать. Я все еще не понимаю почему, но спасибо! – AGuyCalledGerald

+0

По умолчанию привязка модели в MVC принимает значения формы, значения маршрута и значения строки запроса и сопоставляет их с параметрами в ваших действиях. Для правильной работы имена должны совпадать. В этой ситуации ваше представление создавало значение формы с именем EmployeeId. При привязке к модели не было найдено ни одного параметра для действия с именем EmployeeId, поэтому он игнорировал его. Как только вы переименовали параметр, чтобы соответствовать значению формы, он нашел его и установил для вас. Вот достойная статья о привязке модели: http://dotnetslackers.com/articles/aspnet/Understanding-ASP-NET-MVC-Model-Binding.aspx –

5

Не это лямбда-выражение неверно, хотя? Не должна ли она быть

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

вместо

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

Хороший улов, не обращал внимания на эту часть, когда я копировал/вставка из вопроса. –

Смежные вопросы