C# 使用json传递关联数组:控制器中应该使用哪种类型?

C# 使用json传递关联数组:控制器中应该使用哪种类型?,c#,asp.net-mvc,json,C#,Asp.net Mvc,Json,在客户端,我有一个关联数组,其中存储“Guid”-“int”对。 我使用json将数组传递给服务器: $.ajax({ url: methodUrl, type: 'POST', async: false, data: { values: items }, dataType: 'json', success: function (data) { //... } }); 我试图传递的对

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

  $.ajax({
      url: methodUrl,
      type: 'POST',
      async: false,
      data: { values: items },
      dataType: 'json',
      success: function (data) {
          //...
      }
  });
我试图传递的对象如下所示(取自Chrome调试器):

在控制器中,我有一个方法

  public ActionResult Method(Dictionary<Guid, int> values)
  {

  } 
public ActionResult方法(字典值)
{
} 
但是,属性值仍然为空。只要在客户端有一个guid列表,在控制器中有一个guid列表,一切都可以正常工作。 我怀疑我应该为控制器中的值选择另一种类型,而不是字典。 我还尝试在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) {
          //...
      }
  });
这应该正确地发送到您的控制器,并且您不必使用Dictionary对象,您应该将对象从客户端匹配到服务器端。我会使用一个自定义对象,它有一个
Guid
和一个
int
作为属性,并使用它-.NET将匹配这两个属性。尽管如此,使用字典是完全合理的,但这是个人偏好

i、 e


虽然我选择了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<Guid, int> values)
    { ... }
public ActionResult AddNewTeilnahmen(字典值)
{ ... }
我仍然相信这个解决方案更好,因为它不需要创建类,这些类很可能永远不会被重用,并且已经存在于.NET中。
但正如迪克森正确地提到的,这是一个品味的问题

除了Anelook的最后一条评论,下面是javascript数组的创建:

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

你能控制关联数组的格式吗?是的,我有完整的control@Anelook试试
data:items,
@I4V,谢谢你的主意。我试过了,但结果是一样的。此外,在实际场景中,我确实有不止一个参数,因此它不适合我的需要。仅使用Guid int这样一个简单的类型,手动匹配不是一种过火的行为吗?可能是这样,但它让您在传递客户机和控制器信息时遵循良好的实践。另外,在将来维护代码时,更容易弄清楚发生了什么。
列出值
-我会这样做same@thedixon,谢谢你的解释。另一个问题-如果我需要添加多个参数怎么办。我尝试了“数据:{values:obj,parameter2:obj2}”,但它不再工作。我将更新我的答案,2分钟,只是为了说明应该如何做。
    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<Guid, int> values)
    { ... }
var items = [];
$(something).each(function (index, element) {
   var item = { "key": element.guid, "value": element.number };
   items.push(item);
});