ajax - 在 MVC 3 中为 AJAX 请求反序列化字典时出现问题(一种开箱即用的经典 ASP.NET Webforms 方法)

标签 ajax json asp.net-mvc-3 dictionary deserialization

我已经成功地使用相对复杂的参数集(使用 jQuery.ajax 调用)进行 AJAX 调用的 WebForms。我们正在尝试在 MVC 3 中使用相同的方法,但似乎遇到了第一个障碍,因为 MVC 未能成功反序列化字典数组。

在 ASP.NET WebForms“经典”中没有问题的方法如下:

[WebMethod]
public static JQGrid.JQGridData GetListForJQGrid(int? iPageSize, int? iPage, int? iMaxRecords, string sSortField, string sSortOrder,
  Dictionary<string, string> dSearchOptions, Dictionary<string, object>[] aOriginalColumnDefinition, string[] aExtraDataColumns)

下面是 MVC 3 等效项:(注意名称/参数完全相同 - 不同的返回类型,但我认为这不相关)

[HttpPost]
public JSONResult GetListForJQGrid(int? iPageSize, int? iPage, int? iMaxRecords, string sSortField, string sSortOrder,
  Dictionary<string, string> dSearchOptions, Dictionary<string, object>[] aOriginalColumnDefinition, string[] aExtraDataColumns)

使用 WebMethod 可以完美地反序列化所有数据。但是,当调用 MVC 方法时,所有简单参数都可以很好地反序列化,但由于某些未知原因,Dictionary 的数组作为空数组到达。

那么,抛开这些问题:

  • 还有其他人遇到过字典数组的 MVC 3 反序列化问题吗?
  • 默认情况下 MVC 3 是否不使用 System.Web.Script.Serialization.JavaScriptSerializer,我认为这是 ASP.NET WebMethods 在引擎盖下使用的东西?
  • 我可以强制 MVC 3 使用 System.Web.Script.Serialization.JavaScriptSerializer 而不是它正在使用的东西吗?
  • 或者我错过了什么/我的方法应该略有不同吗?请注意,至少现在我们需要在经典 ASP.NET WebMethods 和 MVC 3 之间共享客户端代码,因此我们希望尽可能保持原样。
  • 最后,我发现有一个可能的解决方法可以用来解决这个问题:POST json dictionary .这个变通办法是镇上唯一的游戏还是自提出这个问题后情况有所改善?

jQuery AJAX 调用:

$.ajax(_oJQGProperties.sURL, //URL of WebService/PageMethod used
{
  data: JSON.stringify(oPostData),
  type: "POST",
  contentType: "application/json",
  complete: DataCallback
});

示例 JSON.stringify(oPostData):

{
"dSearchOptions":{},
"aOriginalColumnDefinition":
[
{"name":"ID","sortable":false,"hidedlg":true,"align":"right","title":false,"width":40},
{"name":"URL","sortable":false,"hidedlg":true,"align":"left","title":false,"width":250,"link":"javascript:DoSummat(this,'{0}');","textfield":"Name"},
{"name":"Description","sortable":false,"hidedlg":true,"align":"left","title":false,"width":620}
],
"aExtraDataColumns":["Name"],
"_search":false,
"iPageSize":-1,
"iPage":1,
"sSortField":"",
"sSortOrder":"",
"iMaxRecords":0
}

最佳答案

我没有任何绑定(bind)到字典数组的经验,但一种可能的解决方案是使用自定义模型绑定(bind)器。 Scott Hanselman 有一篇关于此主题的博客文章,您可能会发现它很有用:Splitting DateTime - Unit Testing ASP.NET MVC Custom Model。

关于ajax - 在 MVC 3 中为 AJAX 请求反序列化字典时出现问题(一种开箱即用的经典 ASP.NET Webforms 方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6881440/

相关文章:

c# - 在 C# 中使用 LINQ 自动递增通用列表

php - 如何在不刷新PHP页面的情况下更新MYSQL字段?

java - SpringMVC之clientSide view技术处理JsonResponse

Asp.net MVC 3 Ajax.beginform提交-发送什么

使用 php 的 Javascript AJAX 上传 BLOB 图像。 $_FILES 为空

java - 对 REST 端点进行单元测试的最佳方法是什么( Jersey )

jquery - 相对于文本框定位元素

java - 在 Apache Camel 中从 Json 检索对象

Android:JSON 字符串数据与其他字符串比较

asp.net-mvc - MVC 中的打印页面功能