12

这是一个 MVC3 应用程序。我对我的操作有以下 javascript 调用:

 function editDescription(docId,fileName, fileDescription) {
    $.ajax({
         type: "POST",
         url: "/OrderDetail/LoadModelData",
         contentType: "application/json; charset=utf-8",
         data: "{'id': '"+docId +"', 'filename': '"+fileName+"', 'description': '"+fileDescription+"'}",
         dataType: "json",
         success: function (result) {
         alert("ok: "+ result.d);
         },
         error: function (result) {
             alert('Oh no: '+ result.responseText);
         }
     });

这是我的行动:

    [HttpPost]
    public string LoadModelData(string id, string filename, string description)
    {
        return filename;
    }

我运行代码,使用参数调用动作,没有什么是空的,但每次都会调用错误函数。所以每次都会出现带有“Oh no”的警告框,但是从操作返回的字符串是正确的。如果文件名是 test.pdf,则错误警报框会显示

    'Oh No: test.pdf'. 

我查看了 Firebug,没有错误。尽管没有错误,为什么不调用成功函数?

4

2 回答 2

16

您期望(返回)string您的操作方法的值。为什么需要将数据类型指定为jsonthen ?删除它,看看会发生什么。并且响应中没有d属性!所以只需在警报中使用结果。

$.ajax({
         type: "POST",
         url: "/OrderDetail/LoadModelData",
         contentType:"application/json; charset=utf-8",         
         data: JSON.stringify({ 
                             id: docId, 
                             filename: fileName, 
                             description: fileDescription 
                            }),
         success: function (result) {
         alert("ok: "+ result);
         },
         error: function (result) {
             alert('Oh no: '+ result.responseText);
         }
     });

datatype 属性告诉服务器客户端期望返回什么样的内容作为结果。

编辑:正如 Darin 提到的,请使用该JSON.stringify方法来构建 JSON 请求。更新此答案以包括未来访问者的正确方法。

于 2012-06-13T16:34:43.963 回答
9

永远不要使用字符串操作构建 JSON:

data: "{'id': '"+docId +"', 'filename': '"+fileName+"', 'description': '"+fileDescription+"'}",

绝对是可怕和错误的。你没有编码任何东西。足够的报价,description一切都会打破。操作 JSON 时始终使用 JSON 解析器

像这样:

$.ajax({
     type: "POST",
     url: "/OrderDetail/LoadModelData",
     contentType: "application/json; charset=utf-8",
     data: JSON.stringify({ 
         id: docId, 
         filename: fileName, 
         description: fileDescription 
     }),
     success: function (result) {
         alert("ok: "+ result.filename);
     },
     error: function (result) {
         alert('Oh no: '+ result.responseText);
     }
 });

JSON.stringify方法是本地内置的现代浏览器。如果您需要支持旧版浏览器,您可以包含json2.js脚本

另一个错误是您的控制器操作签名。在 ASP.NET MVC 控制器操作必须返回 ActionResults,而不是字符串:

[HttpPost]
public ActionResult LoadModelData(string id, string filename, string description)
{
    return Json(new { filename = filename });
}
于 2012-06-13T16:41:44.863 回答