6

在客户端,我有一个关联数组,其中存储“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<Guid, int> values)
  {

  } 

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

任何建议表示赞赏!

4

3 回答 3

4

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

var data = {
   values: items
}

var obj = $.toJSON(data);

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

这应该正确发送到您的控制器,并且您不必使用 Dictionary 对象,您应该将对象从客户端匹配到服务器端。我会使用一个自定义对象,其中包含 aGuid和 aint作为属性,并使用它 - .NET 将匹配这两者。话虽如此,使用字典是完全合理的,但这是个人喜好。

IE

public CustomObject 
{
    public Guid MyGuid { get; set; }
    public int MyNumber { get; set; }
}

public ActionResult Method(List<CustomObject> 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
}
于 2013-04-11T13:40:56.900 回答
3

尽管我选择了 thedixon 的答案作为解决方案,但我最终还是设法避免使用任何其他类。

最重要的部分是发送到服务器的集合的类型应该是具有键值类型的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)
    { ... }

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

于 2013-04-12T12:06:10.937 回答
1

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

var items = [];
$(something).each(function (index, element) {
   var item = { "key": element.guid, "value": element.number };
   items.push(item);
});
于 2014-10-07T12:55:06.563 回答