Десериализация дочернего объекта ASP.NET MVC - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть два идентичных выпадающих списка для идентичных подвойств моего элемента TaskViewModel.

@Html.DropDownListFor(x => x.AssignedTo.ID, TaskHelper.GetUsersSelect(Model.AssignedTo), new { @class = "select" })

@Html.DropDownListFor(x => x.Controller.ID, TaskHelper.GetUsersSelect(Model.Controller), new { @class = "select" })

Оба значения отправка в форме отправки (... & AssignedTo.ID = 1 & Controller.ID = 1 ...), но я всегда получаю только задание. Назначено на десериализацию

  public ActionResult SaveTask(TaskViewModel task)
  {
      task.AssignedTo.ID //value here
      task.Controller.ID //null reference exception
  }

  public class TaskViewModel
  {
      public UserViewModel Controller { get; set; }
      public UserViewModel AssignedTo{ get; set; }
  }

  public class UserViewModel
  {
     public long ID { get; set; }
     public string Title { get; set; }
  }

В чем может быть причина такого странного поведения?

1 Ответ

2 голосов
/ 29 сентября 2011

Похоже, Controller является зарезервированным ключевым словом, а связывателю модели по умолчанию это не нравится.Попробуйте переименовать свойство:

public class TaskViewModel
{
    public UserViewModel TaskController { get; set; }
    public UserViewModel AssignedTo { get; set; }
}

Вся проблема связана с ValueProvider, который использует связыватель модели по умолчанию.Когда он встречает свойство навигации Controller, он делает это:

var value = ValueProvider.GetValue("Controller");

, который, к сожалению, сначала просматривает данные маршрута, а затем - в строке запроса.Таким образом, это возвращает «Home» или любое другое имя контроллера и, очевидно, попытка присвоить строку «Home» классу типа UserViewModel не может привести к успеху.

...