使用json传递一个关联数组:控制器中期望的类型
本文关键字:控制器 数组 期望 类型 关联 一个 json 使用 | 更新日期: 2023-09-27 18:08:53
在客户端,我有一个关联数组,用于存储"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)
{
}
但是,属性值仍然为空。只要在客户端有一个Guids列表,在控制器中有一个list,一切都可以正常工作。我怀疑我应该为控制器中的值选择另一种类型,而不是Dictionary。我还尝试在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将匹配这两个。话虽如此,使用字典是完全合理的,但这是个人偏好。
。
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
}
虽然我选择了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中。但正如狄克逊正确地提到的,这是一个品味问题。
除了Anelook最后的注释,这里是javascript数组的创建:
var items = [];
$(something).each(function (index, element) {
var item = { "key": element.guid, "value": element.number };
items.push(item);
});