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

Rob*_*ert 1 c# asp.net-mvc jquery

我的代码进行了ajax调用:

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

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

public JsonResult EmailUserKeys(string UserId)
{
    ...
    return Json(new { success = true });
}
Run Code Online (Sandbox Code Playgroud)

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

为什么?

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

Dar*_*rov 8

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

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

或使用POST请求:

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

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

url: "@Url.Action("EmailUserKeys", "Controller")",
Run Code Online (Sandbox Code Playgroud)

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

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

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


Rob*_*ier 5

您应该将代码编辑为:

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

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

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

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

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

希望这可以帮助你!