【问题标题】:Post multiple parameters to MVC Controller using jQuery.post使用 jQuery.post 将多个参数发布到 MVC 控制器
【发布时间】: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"); }

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

【问题讨论】:

    标签: asp.net-mvc jquery


    【解决方案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) 最后为控制器函数添加一个属性,以便它使用反序列化器类来获取参数。

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

        迪帕克·乔拉

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 1970-01-01
          • 2012-11-01
          • 2015-08-17
          • 2012-11-26
          相关资源
          最近更新 更多