使用json传递关联数组:在控制器中期望哪种类型?

在客户端,我有一个关联数组,我存储“Guid” – “int”对。 我使用json将数组传递给服务器:

$.ajax({ url: methodUrl, type: 'POST', async: false, data: { values: items }, dataType: 'json', success: function (data) { //... } }); 

我尝试传递的对象看起来像这样(取自Chrome调试器):

  items: Object 44f871e0-daee-4e1b-94c3-76d633a87634: 1 698ce237-3e05-4f80-bb0d-de948c39cd96: 1 

在控制器中我有一个方法

  public ActionResult Method(Dictionary values) { } 

但是,属性值保持为null。 只有客户端的Guids列表和控制器中的List一切正常。 我怀疑我应该为控制器中的值选择另一种类型,而不是字典。 我也尝试在ajax请求中添加“traditional:true”,但没有成功。

任何建议表示赞赏!

这是我在使用POST命令时所做的事情:

 var data = { values: items } var obj = $.toJSON(data); $.ajax({ url: methodUrl, type: 'POST', async: false, data: obj, dataType: 'json', success: function (data) { //... } }); 

这应该正确地发送到你的Controller,你不应该使用Dictionary对象,你应该匹配从客户端到服务器端的对象。 我使用一个自定义对象,它有一个Guid和一个int作为属性,并使用它 – .NET将匹配这两个。 话虽如此,使用词典是完全合理的,但这是个人偏好。

 public CustomObject { public Guid MyGuid { get; set; } public int MyNumber { get; set; } } public ActionResult Method(List values) { } 

有多个参数:

 items.SecondNumber = yourVariable; // In reality, you'd have a loop around your items and set this SecondNumber. var data = { values: items } var obj = $.toJSON(data); public CustomObject { public Guid MyGuid { get; set; } public int MyNumber { get; set; } public int SecondNumber { get; set; } // This is why we use CustomObject } 

虽然我选择了dixon的答案作为解决方案,但我最终设法避免使用任何其他类。

最重要的部分是发送到服务器的集合的类型应该是具有键值类型的javascript数组。 例如,这是我在发送到服务器之前在js中创建的对象:

 items : Array[2] 0: Object key: "ddac666f-310f-4022-a22c-c542355b765e" value: 1 1: Object key: "ce9ae5a6-e6a6-4bb6-b61c-b1cc324be049" value: 1 

在此之后,有必要对其进行字符串化,然后发送到服务器。

  var obj = JSON.stringify(items); $.ajax({ url: teilnahmen.AddNewTeilnahmenUrl, type: 'POST', traditional: true, dataType: 'json', data: obj, contentType: "application/json", success: function (data) { //... } }); 

在服务器端:

  public ActionResult AddNewTeilnahmen(Dictionary values) { ... } 

我仍然相信这个解决方案更好,因为它不需要创建很可能永远不会重用并且已经存在于.NET中的类。 但正如迪克森正确提到的那样,这是一个品味问题。

除了Anelook的最后评论,这里是javascript数组的创建:

 var items = []; $(something).each(function (index, element) { var item = { "key": element.guid, "value": element.number }; items.push(item); });