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响应,最后显示错误消息报错了。