使用 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 控制器的主要内容,如果未能解决你的问题,请参考以下文章