C# 使用json传递关联数组:控制器中应该使用哪种类型?
在客户端,我有一个关联数组,其中存储“Guid”-“int”对。 我使用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) { //... } }); 我试图传递的对
$.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);
});