ASP.NET Core MVC中Controller的Action,默认既支持HttpGet,又支持HttpPost

我们知道ASP.NET Core MVC中Controller的Action上可以声明HttpGet和HttpPost特性标签,来限制可以访问Action的Http请求类型(GET、POST等)。

那么默认情况下如果我们没有给Controller的Action声明任何标签,那Action支持的是什么类型的Http请求呢?

为此我们新建一个ASP.NET Core MVC项目,并且新建一个HomeController,它有两个Action,如下所示:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
        
    public object ShowData()
    {
        return new { Message="Good job!" };
    }
}

其中ShowData这个Action会返回一个Json对象,用来响应从客户端浏览器发送过来的Ajax请求,也就是Http请求。

此外我们给HomeController的Index这个Action定义了一个视图Index.cshtml,如下所示:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <script type="text/javascript" src="~/lib/jquery/dist/jquery.js"></script>
    <script type="text/javascript">
        $(function (){
            $("#btnPost").click(function () {
                $.ajax({
                    type: "POST",
                    cache: false,
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    url: "/Home/ShowData",
                    data: {},
                    success: function (data) {
                        alert(data.message);
                    },
                    error: function (xhr, ts, et) {
                        alert("Error");
                    }
                });
            });

            $("#btnGet").click(function () {
                $.ajax({
                    type: "GET",
                    cache: false,
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    url: "/Home/ShowData",
                    data: {},
                    success: function (data) {
                        alert(data.message);
                    },
                    error: function (xhr, ts, et) {
                        alert("Error");
                    }
                });
            });
        });
    </script>
</head>
<body>
    <div>
        <button id="btnPost">Post</button>
    </div>
    <div>
        <button id="btnGet">Get</button>
    </div>
</body>
</html>

该视图上,两个Html按钮btnGet和btnPost,分别用来向HomeController的ShowData这个Action,发送GET和POST类型的Ajax请求。

如果 Ajax请求成功被ShowData这个Action响应,那么页面会输出ShowData返回的message值“Good job!”。

如果 Ajax请求没有被ShowData这个Action响应,那么页面会输出错误消息“Error”。

下面我们就来测试下:

访问Url地址Home/Index,在浏览器中先点击页面上的btnGet按钮,发送GET请求,结果如下:

然后在浏览器中点击页面上的btnPost按钮,发送POST请求,结果如下:

可以看到当我们没有给HomeController中的ShowData这个Action上声明任何特性标签的时候,实际上就相当于既声明了HttpGet特性标签,又声明了HttpPost特性标签,ShowData会同时响应两种类型的Http请求,相当于如下代码:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    [HttpGet]
    [HttpPost]
    public object ShowData()
    {
        return new { Message = "Good job!" };
    }
}

但是如果我们只给ShowData上声明一个Http特性标签,那么其就只会响应一种类型的Http请求了,例如如果我们现在在ShowData上只声明HttpPost特性标签,如下所示:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public object ShowData()
    {
        return new { Message = "Good job!" };
    }
}

那么现在点击视图Index.cshtml上的btnGet按钮,会显示如下结果:

 

可以看到GET类型的Ajax请求没有被ShowData响应,最后显示错误消息报错了。

猜你喜欢

转载自www.cnblogs.com/OpenCoder/p/10316446.html