#asp.net-mvc #rest #javascriptmvc
#asp.net-mvc #остальное #javascriptmvc
Вопрос:
Мое приложение использует 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 может автоматически отображать вложенные объекты из значений формы? Спасибо за любую помощь!
Ответ №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
Вы можете взглянуть на следующий пост в блоге, чтобы узнать формат wire, используемый для коллекций.
В качестве альтернативы вы могли бы использовать запросы JSON.
Комментарии:
1. Прошу прощения за задержку с возвращением к этому вопросу — мне пришлось переключиться на другой проект на пару недель. @Darin — Это имеет смысл — моя проблема в том, что у меня нет никакого контроля над самим форматом — он сериализуется jquery, и это то, что он отправляет. Я использую JavaScriptMVC, который включает вспомогательный метод .save() для объектов модели, который вызывает jquery за кулисами. Я просмотрел код JMVC и не вижу ничего нестандартного — мне кажется, что jquery сам обрабатывает форматирование. Есть идеи?
2. @jdraper3, не нужно извиняться. Это вы задали вопрос. Лично я знаю ответ, поэтому я не спешу 🙂
3. Спасибо за помощь — в итоге я использовал запросы JSON, и это отлично работает.