编辑:我已经得到了解决方案,并在文章的末尾对其进行了更详细的描述
使用: MVC 3,C#
问题:通过$..post/$..ajax发送给控制器的key/value obj数组在控制器上导致500个内部服务器错误(因为传递给C#控制器中的方法的值为null)
我有一个格式的数组:
{
"q_1": {
"qid": "1",
"tmr": 0
},
"q_2": {
"qid": "2",
"tmr": 0
}
}
我通过$("#myid").data()获得这个信息,这一切都很好。
我需要把这个发送到我的控制器,并尝试了post和$.ajax。
var d = $("#q_data").data();
$.post("/run/submit", d, function(data) { alert(data);}, "application/json");
和
$.ajax({
url: '/run/submit',
data: d,
contentType: 'application/json',
dataType: 'json',
success: function (data) { alert(data); }
});
C#端的方法是
public ActionResult Submit(List<PerfObj> dict)
{
int x = dict.Count;
return PartialView("_DummyPartial");
}
PerfObj是我的模型
public class PerfObj
{
public string id { get; set; }
Perfvar perfVar;
}
public class PerfVar
{
public string qid { get; set; }
/* note I've tried both int and string for the tmr param */
public string tmr { get; set; }
}
当我执行此操作时,调用将正确地传递给控制器,即它将命中submit方法。但是,方法参数dict,在
List<PerfObj> dict
是空的。
为什么?它似乎与我的模型有关,它不知道如何设计它,因此它正确地将值提取到方法参数中。
当我在控制台上打印JSON.Stringify时,它正确地显示了键/值对,因此我认为它会正确地传递到服务器,但是由于某种原因,服务器/MVC3 3不喜欢它,或者不能将它映射到PerfObjs列表。
编辑:解决方案
Maciej对我的帖子的回答是我是如何解决的。我最终所做的是在客户端创建一个perfObj数组。
$("#q_data").data(e,{key: e, perfVar: { qid: e, tmr: 0 }})
(ps -忽略e的多余用法,我有其他计划,这是一个假的例子)
然后我将它映射到一个JSON友好数组
var arr = [];
$.each($('#q_data').data(), function (i, e) {
var p = $(this).data(i);
var obj = { key: i, perfVar: { id: e.perfVar.qid, tmr: e.perfVar.tmr}};
arr.push(obj);
});
然后把它串起来
var q = JSON.stringify(arr);
$..ajax如Maciej的文章所述。
我正确地重新定义了我的类
public class PerfObj
{
public string key { get; set; }
public PerfVar perfVar { get; set; }
}
public class PerfVar
{
public string id { get; set; }
public int tmr { get; set; }
}
并更改了我的控制器方法的签名。
[HttpPost]
public ActionResult Submit(PerfObj[] dict)
{
return PartialView("_DummyPartial");
}
现在这个方法非常好用,我可以很容易地扩展我的类来完成我想做的事情。
谢谢大家!
发布于 2012-04-02 04:21:29
您的代码有三处错误:
A.财产PerfVar必须公开,并且必须有一个get和设置:
公共类PerfObj {公共字符串id { get;set;}公共Perfvar perfVar { get;set;}
B.您对列表的JSON表示不正确。它应该是:
var e={ "id":"foo","perfVar":{ "qid":"a",“tmr”},{ "id":"foo","perfVar":{ "qid":"a","tmr":“b”};
C.必须对数组进行字符串化,并指定类型:'POST‘,以便通过ajax将其传递给MVC控制器:
$.ajax({ url:'/run/submit',data: JSON.stringify(e),contentType:'application/json,charset=utf-8',dataType:'json',类型:'POST',成功:函数(数据){告警(数据);};};
发布于 2012-04-02 03:32:41
您不能直接将键/值对映射到平面序列。MVC不知道如何做到这一点。
您要么需要一个自定义的模型绑定,要么更好/更简单的选项是更改您在客户端创建JSON的方式,因此它实际上与您的模型匹配。
就像这样:
var perfObjs =
{
{ id: 1, perfVar: { qId: 1, tmr: 0 }},
{ id: 2, perfVar: { qId: 2, tmr: 0 }},
}
$.post("/run/submit", perfObjs, function(data) { alert(data);}, "application/json");
发布于 2012-04-02 03:36:53
因为控制器不将json值识别为List。
为什么不直接将原始字符串传递给控制器并让控制器将json字符串转换为对象呢?那就容易多了。
https://stackoverflow.com/questions/9970430
复制相似问题