Отправьте несколько параметров в MVC Controller, используя jQuery.post - PullRequest
6 голосов
/ 09 апреля 2009

У меня есть контроллер, определенный как:

        [AcceptVerbs(HttpVerbs.Post)]
        public JsonResult PostMoreData(DataContracts.Address address, DataContracts.GeoLocation geoLocation)
        {
            return Json("test");
        }

where DataContracts.Address and DataContracts.GeoLocation are complex types.

На мой взгляд, я пытаюсь опубликовать сообщение с помощью jQuery следующим образом:

        function PostMoreData() {

            var JsonAddress = {

                "Building": $('Building').val(),
                "UnitNumber": $('UnitNumber').val(),
                "StreetNumber": $('StreetNumber').val(),
                "StreetName": $('StreetName').val(),
                "StreetType": $('StreetType').val(),
                "Suburb": $('Suburb').val(),
                "State": $('State').val(),
                "Postcode": $('Postcode').val(),
                "MonthsAtAddress": $('MonthsAtAddress').val()

            };

            var JsonGeoLocation = {
                "Latitude": $('Latitude').val(),
                "Longitude": $('Longitude').val()
            };


            jQuery.post("/AddressValidation/PostMoreData", {address: JsonAddress, geoLocation: JsonGeoLocation}, function(data, textStatus) {
                if (textStatus == "success") {
                    var result = eval(data);
                    if (result.length > 0) {
                        alert(result);
                    }
                }
            }, "json");
        } 

Однако на контроллере я получаю нули.


Это работает, если мой Контроллер принимает только 1 аргумент, и я публикую только один объект.

        [AcceptVerbs(HttpVerbs.Post)]
        public JsonResult PostMoreData(DataContracts.Address address)
        {
            return Json("test");
        }
        function PostMoreData() {

            var JsonAddress = {

                "Building": $('Building').val(),
                "UnitNumber": $('UnitNumber').val(),
                "StreetNumber": $('StreetNumber').val(),
                "StreetName": $('StreetName').val(),
                "StreetType": $('StreetType').val(),
                "Suburb": $('Suburb').val(),
                "State": $('State').val(),
                "Postcode": $('Postcode').val(),
                "MonthsAtAddress": $('MonthsAtAddress').val()

            };


            jQuery.post("/AddressValidation/PostMoreData", JsonAddress, function(data, textStatus) {
                if (textStatus == "success") {
                    var result = eval(data);
                    if (result.length > 0) {
                        alert(result);
                    }
                }
            }, "json");
        } 

Любые идеи, как я могу разместить более одного объекта?

Ответы [ 4 ]

3 голосов
/ 02 июля 2009

Спасибо всем за ваш вклад в этот вопрос.

На этом этапе мы отказались от использования jquery для публикации сложных типов на контроллерах. Вместо этого мы используем среду MS AJAX для этого. ms ajax post автоматически связывает сложные типы из коробки.

Итак, наше решение теперь использует сочетание jquery и ms ajax framework.

Ash

3 голосов
/ 11 апреля 2009

Обратите внимание, что "сериализация по умолчанию", которую выполняет здесь jQuery, не будет работать независимо от того, что делает ваш контроллер. jQuery не «пересекает» карту параметров ниже первого уровня, поэтому пример в вопросе, вероятно, генерирует эти данные поста:

address=[object]&geoLocation=[object]

Другой рабочий пример не содержит никаких подобъектов, поэтому он переводится напрямую, например так:

Building=value&UnitNumber=value&...&MonthsAtAddress=value

Самое простое решение - сделать карту параметров плоской, каждый ключ должен иметь префикс «Адрес». или «GeoLocation.», в зависимости.

2 голосов
/ 09 апреля 2009

Ваш код требует, чтобы способ, которым jquery сериализует объект, был совместим с механизмом связывания модели MVC по умолчанию, что, я думаю, маловероятно.

Если вы можете построить свой объект javascript так, чтобы он сериализовался как плоский объект с точечной нотацией (JsonAddress.Building), который работал бы, или вы можете позволить jquery выполнить сериализацию по умолчанию, а затем создать пользовательский механизм связывания модели для десериализации в типы параметров действия.

0 голосов
/ 01 июля 2009

У меня была такая же проблема, и я ничего не мог заставить работать. Также кто-то поднял это как ошибку с jquery, и они закрыли это как ошибку.

Я нашел несколько решений, которые отвечают на часть всего вопроса. И ответ включает в себя следующее.

1) Клиентская сторона: нам нужно было бы выделить все объекты, которые вам нужно отправить. Это может быть обычный объект или массив. Работает на обоих.

2) Клиентская сторона: вы отправляете данные, как в первом сообщении. Как вы бы возражали за объектом.

Совет. При отправке параметризованных объектов jquery кодирует данные, отправляемые на сервер.

После всех реализаций на стороне сервера 1) Класс десериализатора: который возьмет входную строку и вернет ее обратно в объект / список <> / IList <>, который вы когда-либо определяли как тип данных параметра функции контроллера. Вы должны будете реализовать ActionFilterAttribute для вышеупомянутого.

2) Наконец, добавьте атрибут к функции контроллера, чтобы он использовал класс десериализатора для получения параметров.

Поскольку это довольно много кода, дайте мне знать, если вам нужны подробности или вы решили проблему.

Дипак Чавла

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