Ajax 为什么我不能用GET代替POST?

Ajax 为什么我不能用GET代替POST?,ajax,asp.net-mvc,Ajax,Asp.net Mvc,这是一个很难回答的问题,但我无法完全理解为什么在下面的代码中我只能使用HttpPost(因此它可以运行),而不能使用HttpGet。有人能解释一下吗 [HttpPost] public ActionResult checkNumFocuses() { //stuff happening if (count == 3) { return Json(false)

这是一个很难回答的问题,但我无法完全理解为什么在下面的代码中我只能使用HttpPost(因此它可以运行),而不能使用HttpGet。有人能解释一下吗

 [HttpPost]
        public ActionResult checkNumFocuses()
        {
            //stuff happening

            if (count == 3)
            {
                return Json(false);
            }
            else
            {
                return Json(true);
            }

        }
上面是我的操作方法,它返回true/false

这是前面的ajax调用:

$.ajax({
      type: "POST",
      url: '@Url.Action("checkNumFocuses", "Home")',
      dataType: "json",
      success: successFunc,
      error: errorFunc
});
function successFunc(data, status) {
    if (data == false) {
        $(".alert").show();
        $('.btnfc').addClass('disabled');           
    }
}

如果我删除
HttpPost
属性(因此默认为GET)并将ajax调用中的类型从POST更改为GET,我无法理解为什么。您可以从GET方法返回Json。但是请确保使用
Json
方法重载,该重载接受
JsonRequestBehavior
枚举

这里,您明确表示希望从GET操作方法返回json数据

public ActionResult checkNumFocuses()
{
  //stuff happening
   if (count == 3)
   {
       return Json(false,JsonRequestBehavior.AllowGet);
   }
   else
   {
       return Json(true,JsonRequestBehavior.AllowGet);
   }
}
当前,您将得到500个错误响应(而不是200个OK和有效数据),因为您正试图从GET action方法返回json数据(不指定JsonRequestBehavior枚举值)。由于响应不是200 OK,它将进入ajax调用的错误处理程序部分

理想情况下,GET操作应该是幂等的。这意味着无论执行多少次,它都不应该更改任何数据(并返回相同的响应)。在您的情况下,您的方法不使用任何数据。因此,只要您确定人们可以在浏览器选项卡中访问此url并查看结果,您就可以将此作为GET方法

通常在ASP.NET MVC应用程序中,GET方法应该返回视图/视图响应(标记),通常POST方法对发布的表单数据/ajax数据进行一些处理(例如:更新一些数据等),并返回一个响应,可以是JSON。但是,如果您真的想从GET-action方法返回Json数据,则必须使用上面的方法显式指定


当然,WebAPI有不同的概念(以及幕后实现)

是的。您可以从GET方法返回Json。但是请确保使用
Json
方法重载,该重载接受
JsonRequestBehavior
枚举

这里,您明确表示希望从GET操作方法返回json数据

public ActionResult checkNumFocuses()
{
  //stuff happening
   if (count == 3)
   {
       return Json(false,JsonRequestBehavior.AllowGet);
   }
   else
   {
       return Json(true,JsonRequestBehavior.AllowGet);
   }
}
当前,您将得到500个错误响应(而不是200个OK和有效数据),因为您正试图从GET action方法返回json数据(不指定JsonRequestBehavior枚举值)。由于响应不是200 OK,它将进入ajax调用的错误处理程序部分

理想情况下,GET操作应该是幂等的。这意味着无论执行多少次,它都不应该更改任何数据(并返回相同的响应)。在您的情况下,您的方法不使用任何数据。因此,只要您确定人们可以在浏览器选项卡中访问此url并查看结果,您就可以将此作为GET方法

通常在ASP.NET MVC应用程序中,GET方法应该返回视图/视图响应(标记),通常POST方法对发布的表单数据/ajax数据进行一些处理(例如:更新一些数据等),并返回一个响应,可以是JSON。但是,如果您真的想从GET-action方法返回Json数据,则必须使用上面的方法显式指定


当然,Web API有不同的概念(以及幕后实现)

您可以使用GET。但是您还需要在
JsonRequestBehavior

[HttpGet]
public ActionResult checkNumFocuses()
{
    ....
    return Json(true, JsonRequestBehavior.AllowGet);
}

你可以使用GET。但是您还需要在
JsonRequestBehavior

[HttpGet]
public ActionResult checkNumFocuses()
{
    ....
    return Json(true, JsonRequestBehavior.AllowGet);
}


如果删除它会发生什么?在这方面你不清楚。你可以使用GET。什么对你不起作用?如果我删除它,如果我更改前面的部分,使类型为GET,则执行错误函数。否则它会像我粘贴的那样工作。为什么它会进入错误回调?错误状态码?不可解析的响应文本?在浏览器控制台中查看。您看到了什么错误?如果删除它会发生什么?在这方面你不清楚。你可以使用GET。什么对你不起作用?如果我删除它,如果我更改前面的部分,使类型为GET,则执行错误函数。否则它会像我粘贴的那样工作。为什么它会进入错误回调?错误状态码?不可解析的响应文本?在浏览器控制台中查看。你看到了什么错误?谢谢。但是,无论如何,在这种情况下,这两种方法中哪一种最好?为什么?如果你改变了方法中的数据(例如更新数据库),那么它应该是一篇文章。如果要更新现有记录,应该使用PUT或修补程序。这篇文章应该是为了创造一个新的记录。谢谢。但是,无论如何,在这种情况下,这两种方法中哪一种最好?为什么?如果你改变了方法中的数据(例如更新数据库),那么它应该是一篇文章。如果要更新现有记录,应该使用PUT或修补程序。这篇文章应该是为了创造一个新的记录。谢谢。但是,无论如何,在这种情况下,这两种方法中哪一种最好?为什么呢?在这种情况下,您可以使用我在答案中提到的重载(假设您可以在选项卡中直接访问url并看到结果)非常感谢详细的答案:)谢谢。但是,无论如何,在这种情况下,这两种方法中哪一种最好?为什么呢?在这种情况下,您可以使用我在答案中提到的重载GET(假设您可以在选项卡中直接访问url并看到结果),非常感谢您提供的详细答案:)