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

时间:2024-01-09 22:15:38

我们知道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请求,结果如下:

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

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

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

可以看到当我们没有给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按钮,会显示如下结果:

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

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