首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MVC3-jQueryDataKey值对$.ajax和JSON将导致500个内部错误--我如何做到这一点?

MVC3-jQueryDataKey值对$.ajax和JSON将导致500个内部错误--我如何做到这一点?
EN

Stack Overflow用户
提问于 2012-04-02 03:04:31
回答 3查看 6K关注 0票数 2

编辑:我已经得到了解决方案,并在文章的末尾对其进行了更详细的描述

使用: MVC 3,C#

问题:通过$..post/$..ajax发送给控制器的key/value obj数组在控制器上导致500个内部服务器错误(因为传递给C#控制器中的方法的值为null)

我有一个格式的数组:

代码语言:javascript
运行
复制
{
  "q_1": {
    "qid": "1",
    "tmr": 0
  },
  "q_2": {
    "qid": "2",
    "tmr": 0
  }
}

我通过$("#myid").data()获得这个信息,这一切都很好。

我需要把这个发送到我的控制器,并尝试了post和$.ajax。

代码语言:javascript
运行
复制
var d = $("#q_data").data();
$.post("/run/submit", d, function(data) { alert(data);}, "application/json");

代码语言:javascript
运行
复制
$.ajax({ 
           url: '/run/submit',
           data: d,
           contentType: 'application/json',
           dataType: 'json',
           success: function (data) { alert(data); }
           });

C#端的方法是

代码语言:javascript
运行
复制
 public ActionResult Submit(List<PerfObj> dict)
 {
      int x = dict.Count;
      return PartialView("_DummyPartial");
 }

PerfObj是我的模型

代码语言:javascript
运行
复制
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,在

代码语言:javascript
运行
复制
List<PerfObj> dict

是空的。

为什么?它似乎与我的模型有关,它不知道如何设计它,因此它正确地将值提取到方法参数中。

当我在控制台上打印JSON.Stringify时,它正确地显示了键/值对,因此我认为它会正确地传递到服务器,但是由于某种原因,服务器/MVC3 3不喜欢它,或者不能将它映射到PerfObjs列表。

编辑:解决方案

Maciej对我的帖子的回答是我是如何解决的。我最终所做的是在客户端创建一个perfObj数组。

代码语言:javascript
运行
复制
$("#q_data").data(e,{key: e, perfVar: { qid: e, tmr: 0 }})

(ps -忽略e的多余用法,我有其他计划,这是一个假的例子)

然后我将它映射到一个JSON友好数组

代码语言:javascript
运行
复制
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);
});

然后把它串起来

代码语言:javascript
运行
复制
var q = JSON.stringify(arr);

$..ajax如Maciej的文章所述。

我正确地重新定义了我的类

代码语言:javascript
运行
复制
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; }
}

并更改了我的控制器方法的签名。

代码语言:javascript
运行
复制
    [HttpPost]
    public ActionResult Submit(PerfObj[] dict)
    {
        return PartialView("_DummyPartial");
    }

现在这个方法非常好用,我可以很容易地扩展我的类来完成我想做的事情。

谢谢大家!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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',成功:函数(数据){告警(数据);};};

票数 3
EN

Stack Overflow用户

发布于 2012-04-02 03:32:41

您不能直接将键/值对映射到平面序列。MVC不知道如何做到这一点。

您要么需要一个自定义的模型绑定,要么更好/更简单的选项是更改您在客户端创建JSON的方式,因此它实际上与您的模型匹配。

就像这样:

代码语言:javascript
运行
复制
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");
票数 2
EN

Stack Overflow用户

发布于 2012-04-02 03:36:53

因为控制器不将json值识别为List。

为什么不直接将原始字符串传递给控制器并让控制器将json字符串转换为对象呢?那就容易多了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9970430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档