Backbonejs обновляет модель с idAttribute, установленным в Id - PullRequest
2 голосов
/ 27 марта 2012

Я пытаюсь обновить модель магистрали, на стороне сервера asp.net mvc 4. Я получаю:

Исключение «System.ArgumentException: элемент с тем же ключом уже добавлен».

Причина в том, что магистраль отправляет Id и id на сервер в качестве свойств, а JsonValueProvider пытается добавить это в словарь.

Вот моя модель:

 var Task = Backbone.Model.extend({
        url: "/tasks/task",
        idAttribute: "Id"
 });

Отправляется на сервер через запрос Put:

{"Id":294912,"Task":"test","DueDate":"2012-03-24T02:00:00.000Z", "id":294912}

Есть ли способ запрета магистрали при отправке свойства "id"?

Ответы [ 2 ]

3 голосов
/ 01 апреля 2012

Проблема здесь в том, что соглашения в C # не такие, как в JavaScript. В C # классы имеют свойства, которые начинаются с заглавных букв (регистр Pascal), а в JavaScript это норма для запуска ваших свойств в нижнем регистре (регистр Camel).

Таким образом, при сериализации моделей представлений стандартное поведение сериализатора JSON.NET заключается в том, чтобы сериализовать объект точно с той же заглавной буквой свойств. Я мог бы переименовать свойства модели представления в случай верблюда, но это было бы так «странно», как если бы в ваших объектах JavaScript были свойства с регистром паскаля.

Таким образом, вместо того, чтобы принудительно использовать Backbone нестандартным способом, я изменил сериализацию объектов для преобразования свойств случая Pascal в свойства случая Camel, используя функциональность Contract Resolver в JSON.NET.

var settings = new JsonSerializerSettings();
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
JsonSerializer serializer = JsonSerializer.Create(settings);

JsonConvert.SerializeObject(object, Formatting.None, settings);

Теперь это создает согласованность на стороне клиента с моим кодом и со всеми классными библиотеками.

0 голосов
/ 27 марта 2012

Похоже, проблема в коде на стороне сервера, а не в вызове Backbone. PUT - это операция редактирования на сервере, поэтому вы обновляете существующую сущность. Вам необходимо свойство ID, чтобы идентифицировать модель на сервере и обновить измененные свойства.

Если ASP.NET MVC жалуется на то, что модель уже существует в базе данных, вы пытаетесь сделать INSERT вместо UPDATE. Нам нужно увидеть контроллер и код доступа к данным, чтобы увидеть, где все идет не так.

ОБНОВЛЕНИЕ : Что произойдет, если вы отключите свойство idAttribute? Из документации Backbone:

A special property of models, the id is an arbitrary string (integer id or UUID). 
If you set the id in the attributes hash, it will be copied onto the model as a 
direct property.

Атрибут id должен отправляться по умолчанию; похоже, вы заставляете включить его во второй раз.

Под idAttribute в документах:

A model's unique identifier is stored under the id attribute. If you're directly communicating 
with a backend (CouchDB, MongoDB) that uses a different unique key, you may set a Model's 
idAttribute to transparently map from that key to id.

Модель связывания ASP.NET MVC должна быть в состоянии справиться с id против Id.

ОБНОВЛЕНИЕ: найдено хорошее сообщение в блоге , в котором описывается использование модели представления для помощи в сериализации объектов C # в формате, который ожидает Backbone. Это кажется разумным, хотя и немного раздражающим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...