为什么我不能使用GET而不是POST?

时间:2017-03-20 22:07:20

标签: ajax asp.net-mvc

一个非常菜鸟的问题,但我不能完全理解为什么在下面的代码中我只能使用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。

2 个答案:

答案 0 :(得分:4)

是。您可以从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操作方法返回json数据(而不指定JsonRequestBehavior枚举值)。由于响应不是200 OK,它将进入你的ajax调用的错误处理程序部分。

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

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

当然,Web API有一个不同的概念(并且在幕后实现)

答案 1 :(得分:1)

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

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