使用jQuery.post将多个参数发布到MVC Controller

时间:2009-04-09 02:37:10

标签: asp.net-mvc jquery

我有一个控制器定义为:

        [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");
        } 

但是,在控制器上,我得到了空值。


如果我的Controller仅使用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 个答案:

答案 0 :(得分:3)

请注意,无论您的控制器做什么,jQuery在此处执行的“默认序列化”都无法正常工作。 jQuery不会“遍历”第一级下面的参数映射,因此问题中的示例可能会生成此发布数据:

address=[object]&geoLocation=[object]

另一个工作示例不包含任何子对象,因此它正在直接翻译,如下所示:

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

最简单的解决方法是使参数映射平坦,每个键都以“地址”为前缀。或'GeoLocation。',取决于。

答案 1 :(得分:3)

感谢大家对此问题的意见。

在这个阶段,我们已经不再使用jquery将复杂类型发布到控制器。相反,我们使用ms ajax框架来做到这一点。 ms ajax post很好地自动绑定复杂类型。

所以我们的解决方案现在使用jquery和ms ajax框架的混合。

答案 2 :(得分:2)

您的代码要求jquery序列化对象的方式与MVC默认模型绑定器兼容,我认为这不太可能。

如果您可以构建您的javascript对象,以便将其序列化为带有点符号(JsonAddress.Building)的平面对象,或者您可以让jquery执行默认序列化,然后创建自定义模型绑定器以反序列化为动作参数类型。

答案 3 :(得分:0)

我遇到了同样的问题而无法正常工作。还有人把它作为jquery的bug提出来,他们把它关闭不是一个bug。

我找到了一些解决整个问题部分问题的解决方案。 答案包括以下内容。

1)客户端:我们需要将您需要发送的所有对象变为stringyfy。这可以是普通对象或数组。它适用于两者。

2)客户端:您在第一篇文章中发送数据。正如你所反对的那样。

提示:发送参数化对象时,jquery会对发送到服务器的数据进行编码。

以下是服务器端实现 1)反序列化器类:它将获取输入字符串并将其放回到对象/列表<> / IList<>什么你定义为控制器功能的参数的数据类型。 您需要为上面的内容实现ActionFilterAttribute。

2)最后向控制器函数添加一个属性,以便它使用deserialiser类来获取参数。

由于这是很多代码,如果您需要详细信息或解决了问题,请告诉我。

Deepak Chawla