我有一个控制器定义为:
[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"); }
任何想法如何发布多个对象?
答案 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