使用MVC和$.ajax调用发送POST请求时,Ajax请求返回HTTP错误500?

28

我看过几个关于这个问题的帖子,也尝试了所有答案 (ASP.NET MVC JsonResult return 500)

我的ajax请求返回500内部错误。如果我进行调试,甚至无法进入我的操作。

这是我的ajax调用:

$.ajax({
                    url: '@Url.Action("UpdateSortOrder", "FormItems")',
                    data: { itemToUpdateId: item.attr("id"), newParentItemId: parentItemId, newPreviousItemId: previousItemId },
                    type: 'POST',
                    success: function (data) {
                        console.log(data);
                    },
                    error: function (xhr, status, exception) {
                        console.log("Error: " + exception + ", Status: " + status);
                    }
                });

我的行动:

[HttpPost]
    public ActionResult UpdateSortOrder(Guid itemToUpdateId, Guid newParentItemId, Guid newPreviousItemId)
    {
        FormItem updatedItem = _formItemService.GetOne(x => x.Id == itemToUpdateId);

        return Json(updatedItem, JsonRequestBehavior.DenyGet);
    }

使用Chrome控制台,以下是响应的响应标头:

HTTP/1.1 500 内部服务器错误 Cache-Control: private Content-Type: text/html; charset=utf-8 Server: Microsoft-IIS/7.5 X-AspNetMvc-Version: 3.0 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Date: Tue, 18 Dec 2012 21:53:41 GMT Content-Length: 17041

服务器日志没有显示任何子状态代码。您知道我在这里做错了什么吗?我更喜欢使用POST而不是GET。

表单数据显示为:

itemToUpdateId: 18ac5399-342e-4a39-9da1-3281a89501df

newParentItemId:null

newPreviousItemId:null

这是正确的。

我尝试设置contentType为application/json并且traditional=true,就像在此问题中一样:Sending ajax post to mvc with "application/json; charset=utf-8" returns error 500 from vs web developer server

同样的错误。



3
您尝试使用 Fiddler 查看原始 POST 内容,以查看请求发送了哪些数据吗? - Biff MaGriff
1
你可以分享一下你是如何设置路由的吗? - kabaros
路由正在工作,现在它只是使用通过添加区域填充的默认路由规则。如果我将操作更改为返回视图并输入URL,则可以正常工作,因此路由正在正确处理。 - SventoryMang
1
@BiffMaGriff 我是用Chrome发布的,但我现在已经弄清楚了,感谢我再次检查那个窗口,如果我在Chrome控制台中检查“预览”选项卡,它会给出实际错误,即返回到操作中的formItem存在循环引用错误! - SventoryMang
4个回答

80

我成功地找出了问题所在,我的 AJAX 语法没有问题,甚至操作也正确。只是我的返回对象包含了一个循环引用。我在 Chrome 控制台中通过点击“网络”选项卡下面的 POST 请求,然后查看预览选项卡,才能够看到实际的错误信息。


2
能够使用IE11开发者工具中的网络选项卡>详细信息>响应正文进行类似的故障排除。 - Jason Marsell
对于仍然遇到问题的其他人,请查看此解决方案。它提供了比Fiddler等工具更详细的错误信息。 - usr4896260
1
这是我第三次谷歌到这个宝贵的答案了——必须要记住它!(之前已经点赞过了) - JsAndDotNet
在我的情况下,我返回了一个视图但实际上应该返回 JSON。这是一个很蠢的错误,会导致 500 错误。如果你在任何浏览器中使用网络选项卡,你会清楚地看到来自 asp.net 的错误信息。 - tnk479

2

旧帖,备选答案...以防万一有人会来这里...

我的问题是由于我调用的控制器操作返回了一个局部视图操作结果,并且 .cshtml 局部视图文件在服务器上没有被发布(在 Visual Studio 发布时未被“包含”)。


1

Fiddler是一个很棒的工具,用于捕获HTTP请求,对于调试客户端和服务器端之间的响应非常有用。当您怀疑浏览器中存在问题时,只需打开它,当错误发生时,打开Fiddler并选择请求,然后查看其原始信息即可。


0
如果你在成功后不需要 updatedItem,那么就不要返回它,只需返回一个简单的变量即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接