【问题标题】:JQuery ajax call to MVC action always returns an error when there isn't oneJQuery ajax 对 MVC 操作的调用总是在没有错误时返回错误
【发布时间】:2012-06-16 16:08:19
【问题描述】:

这是一个 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,没有错误。尽管没有错误,为什么没有调用成功函数?

【问题讨论】:

  • 文件名。那就是做它应该做的。错误函数不断被调用,迟早会发生实际错误

标签: c# jquery asp.net-mvc


【解决方案1】:

您期望(返回)来自您的操作方法的 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 请求。更新此答案以包括未来访问者的正确方法。

【讨论】:

  • @user1202717:不客气。很高兴我能帮助你。 :)
  • -1 用于将硬编码的 JSON 字符串留在 ajax 请求中。
  • 是的,我在评论中提到过:原因是您将硬编码的 JSON 字符串留在了未正确编码的 data 参数中。您还留下了一个控制器操作返回字符串,这也是错误的。我看到很多人都犯了这个错误,所以每次看到这样的代码时指出这个可怕的错误对我来说绝对是至关重要的。
  • @DarinDimitrov:感谢您指出这一点。我更新了我的答案,以包括未来访问者参考的正确方法。 OP的问题具有返回字符串的操作方法。我只是在帮助解决 ajax 调用问题。只是出于好奇,如果我从操作方法返回字符串(我的场景就像我只想返回单词),为什么会出现 错误
  • 不,这是错误的,因为当您返回字符串时,您没有设置正确的 Content-Type 标头。您应该始终返回操作结果的实例。
【解决方案2】:

永远不要使用字符串操作构建 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 });
}

【讨论】:

  • 返回的 JsonResult 怎么样?
  • @CoffeeAddict,怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多