使用 jQuery.post 将多个参数发布到 MVC 控制器

Posted

技术标签:

【中文标题】使用 jQuery.post 将多个参数发布到 MVC 控制器【英文标题】:Post multiple parameters to MVC Controller using jQuery.post 【发布时间】:2010-10-18 11:16:31 【问题描述】:

我有一个控制器定义为:

[AcceptVerbs(HttpVerbs.Post)] public JsonResult PostMoreData(DataContracts.Address 地址,DataContracts.GeoLocation geoLocation) 返回 Json("测试"); 其中 DataContracts.Address 和 DataContracts.GeoLocation 是复杂类型。

在我看来,我正在尝试使用 jQuery 来发布:

函数 PostMoreData() var JsonAddress = "建筑": $('建筑').val(), "UnitNumber": $('UnitNumber').val(), "街道编号": $('街道编号').val(), "街名": $('街名').val(), "StreetType": $('StreetType').val(), “郊区”:$('郊区').val(), "状态": $('State').val(), "邮编": $('邮编').val(), "MonthsAtAddress": $('MonthsAtAddress').val() ; var JsonGeoLocation = "纬度": $('纬度').val(), "经度": $('经度').val() ; jQuery.post("/AddressValidation/PostMoreData", address: JsonAddress, geoLocation: JsonGeoLocation, function(data, textStatus) if (textStatus == "成功") var 结果 = 评估(数据); if (result.length > 0) 警报(结果); , "json");

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


如果我的控制器只接受 1 个参数并且我只发布一个对象,它就可以工作。

[AcceptVerbs(HttpVerbs.Post)] public JsonResult PostMoreData(DataContracts.Address 地址) 返回 Json("测试"); 函数 PostMoreData() var JsonAddress = "建筑": $('建筑').val(), "UnitNumber": $('UnitNumber').val(), "街道编号": $('街道编号').val(), "街名": $('街名').val(), "StreetType": $('StreetType').val(), “郊区”:$('郊区').val(), "状态": $('State').val(), "邮编": $('邮编').val(), "MonthsAtAddress": $('MonthsAtAddress').val() ; jQuery.post("/AddressValidation/PostMoreData", JsonAddress, function(data, textStatus) if (textStatus == "成功") var 结果 = 评估(数据); if (result.length > 0) 警报(结果); , "json");

有什么想法可以发布多个对象吗?

【问题讨论】:

【参考方案1】:

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

address=[object]&geoLocation=[object]

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

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

最简单的解决方法是使参数映射变平,每个键都以“地址”为前缀。或“地理位置。”,具体取决于。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

您能否发布一些示例代码或文章参考,以便我们跟随您的脚步?我遇到了类似或可能相同的问题,但是您的回答没有帮助,因为我现在需要更具体地找出 ms ajax 框架的哪些部分开始尝试前进。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

我遇到了同样的问题,无法进行任何工作。也有人将它作为 jquery 的 bug 提出来,他们将其关闭为不是 bug。

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

1) 客户端:我们需要对您需要发送的所有对象进行字符串化。这可以是普通对象或数组。它适用于两者。

2) 客户端:您像在第一篇文章中一样发送数据。正如你会逐个反对。

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

以下都是服务器端的实现 1) Deserializer 类:它将获取输入字符串并将其放回 object/list/IList 您定义为控制器函数参数的数据类型的任何内容。 您需要为上述实现 ActionFilterAttribute 。

2) 最后为控制器函数添加一个属性,以便它使用反序列化器类来获取参数。

因为这是相当多的代码,如果您需要详细信息或解决了问题,请告诉我。

迪帕克·乔拉

【讨论】:

以上是关于使用 jQuery.post 将多个参数发布到 MVC 控制器的主要内容,如果未能解决你的问题,请参考以下文章

jquery post 怎么接受后台的多个参数

jquery $.post()返回数据

jQuery post ajax函数[重复]

PHP 使用 jQuery .post() 提交带有多个提交按钮的表单

如何利用jQuery post传递含特殊字符的数据

用jquery post将表单值null发布到控制器上。