Передача данных формы в метод контроллера - дочерние свойства не заполняются

Мое приложение использует JavascriptMVC на стороне клиента, а ASP MVC в основном работает только как служба REST. Вот типичный метод контроллера:

public JsonResult Update(CustomerDto dto)
{
  var repository = Factory.NewCustomerRepository())
  // ... Convert DTO back to entity and save changes
  return Json(dto);
}

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

public class CustomerDto
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public PhoneNumberDto[] PhoneNumbers { get; set; }
    // ... more properties
}
public class PhoneNumberDTO
{
    public int Id { get; set; }
    public int CustomerId { get; set; }
    public string Label { get; set; }
    public string Number { get; set; }
}

В действии контроллера PhoneNumbers будет иметь правильное количество элементов в массиве, но каждый объект будет иметь только значения null/значения по умолчанию. Я проверил, что запрос отправляет все соответствующие данные формы:

Id          26
FirstName   A
LastName    Person
MiddleName  Test
PhoneNumbers[0][CustomerID  26
PhoneNumbers[0][Id] 5
PhoneNumbers[0][Label]  Mobile
PhoneNumbers[0][Number] (555)555-5555
PhoneNumbers[1][CustomerID  26
PhoneNumbers[1][Id] 8
PhoneNumbers[1][Label]  Home
PhoneNumbers[1][Number] (654)654-6546

Любые идеи о том, что может происходить? Я просто ошибаюсь, думая, что MVC3 может автоматически отображать вложенные объекты из значений формы? Спасибо за любую помощь!


person jdraper3    schedule 11.05.2011    source источник


Ответы (1)


На самом деле запрос должен выглядеть так, если вы хотите, чтобы связыватель модели по умолчанию успешно привязывал эти значения (обратите внимание на PhoneNumbers[0].CustomerID вместо PhoneNumbers[0][CustomerID]):

Id                          26
FirstName                   A
LastName                    Person
MiddleName                  Test
PhoneNumbers[0].CustomerID  26
PhoneNumbers[0].Id          5
PhoneNumbers[0].Label       Mobile
PhoneNumbers[0].Number      (555)555-5555
PhoneNumbers[1].CustomerID  26
PhoneNumbers[1].Id          8
PhoneNumbers[1].Label       Home
PhoneNumbers[1].Number      (654)654-6546

Вы можете взглянуть на следующую запись в блоге, чтобы узнать о формате передачи, используемом для коллекций.

В качестве альтернативы вы можете использовать Запросы JSON.

person Darin Dimitrov    schedule 11.05.2011
comment
Извиняюсь за задержку с ответом на этот вопрос - мне пришлось переключиться на другой проект на пару недель. @Darin - Это имеет смысл - моя проблема в том, что я не контролирую сам формат - он сериализуется jquery, и это то, что он отправляет. Я использую JavascriptMVC, который включает вспомогательный метод .save() для объектов модели, который вызывает jquery за кулисами. Я прошел через код JMVC и не вижу ничего нестандартного - мне кажется, что jquery сам обрабатывает форматирование. Есть идеи? - person jdraper3; 01.06.2011
comment
@jdraper3, не нужно извиняться. Это ты задал вопрос. Лично я знаю ответ, так что не тороплюсь :-) - person Darin Dimitrov; 01.06.2011
comment
Спасибо за помощь - вместо этого я использовал запросы JSON, и это прекрасно работает. - person jdraper3; 01.06.2011