jQuery $ .ajax成功没有从JsonResult触发

时间:2012-08-22 06:04:06

标签: c# asp.net-mvc jquery

我的代码进行了ajax调用:

$.ajax({
    url: "/Controller/EmailUserKeys",
    dataType: 'json',
    success: function () {
        alert('success');
    },
    error: function () {
        alert('error');
    }
});

它在我的控制器中调用一个动作,它返回一些JSON:

public JsonResult EmailUserKeys(string UserId)
{
    ...
    return Json(new { success = true });
}

我的问题是调用了ajax错误函数而不是ajax成功函数。

为什么?

PS。如果我的动作返回“return null;”,则调用ajax success函数。

2 个答案:

答案 0 :(得分:8)

您必须允许在返回JSON结果时默认禁用的GET:

public JsonResult EmailUserKeys(string UserId)
{
    ...
    return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}

或使用POST请求:

$.ajax({
    url: "/Controller/EmailUserKeys",
    type: "POST",
    dataType: 'json',
    data: { userId: 'some user id' },
    success: function () {
        alert('success');
    },
    error: function () {
        alert('error');
    }
});

也永远不要像你那样硬编码你的控制器动作的URL。在ASP.NET MVC应用程序中处理URL时始终使用url帮助程序:

url: "@Url.Action("EmailUserKeys", "Controller")",

以下是一条建议:如果您正在进行任何Web开发,请使用FireBug之类的javascript调试工具。除了其他有用的东西,它还允许您检查AJAX请求。如果您使用过它,您会看到从服务器发送的响应,如下所示:

  

此请求已被阻止,因为敏感信息可能是   当在GET请求中使用它时向第三方网站公开。   要允许GET请求,请将JsonRequestBehavior设置为AllowGet。

你不需要来StackOverflow并提出这个问题,因为你已经知道了答案。

答案 1 :(得分:5)

您应该将代码编辑为:

public JsonResult EmailUserKeys(string UserId)
{
    return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}

有关详细信息,请参阅官方文档:

http://msdn.microsoft.com/en-us/library/system.web.mvc.jsonrequestbehavior.aspx

默认情况下禁用此功能的原因是因为JSON劫持。有关这方面的更多信息,请访问:

http://haacked.com/archive/2009/06/25/json-hijacking.aspx

希望这会帮助你!