asp.net mvc 3 свойство коллекции ViewModel для json не работает - PullRequest
0 голосов
/ 13 февраля 2011

Добрый вечер всем.В настоящее время я использую MVC 3, и у меня есть view-модель, которая содержит свойство, которое является списком.В настоящее время я использую метод json2 JSON.stringify для передачи моей модели представления в мой метод действия.Во время отладки я замечаю, что все простые свойства выполняются, но свойство коллекции пусто, хотя я точно знаю, что в коллекции есть хотя бы один объект.Я хотел знать, есть ли кто-то, кто сталкивается с той же самой проблемой.Ниже приведен код, который я использую для публикации в методе действия:

$.post("/ReservationWizard/AddVehicleToReservation/",
        JSON.stringify('@ViewData["modelAsJSON"]'),
        function (data) {
            if (data != null) {
                $("#vehicle-selection-container").html(data);
                $(".reservation-wizard-step").fadeIn();
            }
        });

Объект @ViewData["modelAsJSON"] содержит следующий json и передается в мой метод действия {"NumberOfVehicles":1,"VehiclesToService":[{"VehicleMakeId":0,"VehicleModelId":0}]}

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

Если кто-либо имеет представление оэта проблема будет принята с благодарностью.

Заранее спасибо.

ОБНОВЛЕНИЕ

OK после внесения рекомендуемых изменений и совершения вызова на new JavaScriptSerializer().Serialize(@Model) это строка, которая в конечном итоге отправляется в мой метод действия через сообщение '{"NumberOfVehicles":1,"VehiclesToService":[{"VehicleMakeId":0,"VehicleModelId":0}]}'

Я могу отладить и увидеть объект, который отправляется в мой метод действия, но снова свойство коллекции пусто, и я знаю,что наверняка есть хотя бы один объект в коллекции.

Метод действия AddVehicleToReservation объявлен следующим образом: public ActionResult AddVehicleToReservation(VehicleSelection selections) { ... return PartialView("viewName", model); }

1 Ответ

1 голос
/ 13 февраля 2011

Вот проблема:

JSON.stringify('@ViewData["modelAsJSON"]')

JSON.stringify - это функция на стороне клиента, и вы передаете в качестве аргумента список, который хранится в ViewData, поэтому я предполагаю, что он в конечном итоге вызывает .ToString() иу вас есть

JSON.stringify('System.Collections.Generic.List<Foo>')

в вашем окончательном HTML, который, очевидно, не имеет особого смысла.Также не забывайте, что для передачи параметров на сервер с помощью функции $ .post второй параметр должен быть объектом javascript, а не тем, что делает JSON.stringify (он генерирует строку).Таким образом, вам нужно в конечном итоге использовать HTML следующим образом:

$.post(
    'ReservationWizard/AddVehicleToReservation',
    [ { id: 1, title: 'title 1' }, { id: 2, title: 'title 2' } ],
    function (data) {
        if (data != null) {
            $('#vehicle-selection-container').html(data);
            $('.reservation-wizard-step').fadeIn();
        }
    }
);

Итак, чтобы сделать эту работу, вам сначала нужно сериализовать эти ViewData в JSON.Вы можете использовать JavaScriptSerializer класс для этого:

@{
    var myList = new JavaScriptSerializer().Serialize(ViewData["modelAsJSON"]);
}
$.post(
    '@Url.Action("AddVehicleToReservation", "ReservationWizard")',
    // Don't use JSON.stringify: that makes JSON request and without
    // proper content type header your sever won't be able to bind it
    @myList,
    function (data) {
        if (data != null) {
            $('#vehicle-selection-container').html(data);
            $('.reservation-wizard-step').fadeIn();
        }
    }
);

И, пожалуйста, не используйте этот ViewData.Сделайте ваши взгляды строго типизированными и используйте модели представления.

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