JQuery ajax 对 MVC 操作的调用总是在没有错误时返回错误

本文关键字:有错误 错误 返回 ajax MVC 操作 调用 JQuery | 更新日期: 2023-09-27 18:37:16

这是一个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"的警告框,但从操作返回的字符串是正确的。如果文件名是测试.pdf则错误警报框显示

    'Oh No: test.pdf'. 

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

JQuery ajax 对 MVC 操作的调用总是在没有错误时返回错误

您期望(返回)操作方法中的string值。那么为什么需要将数据类型指定为 json ?删除它,看看会发生什么。并且响应中没有 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请求。更新此答案以包括未来访问者的正确方法。

切勿使用字符串操作构建 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 控制器操作必须返回操作结果,而不是字符串:

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