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響應,最后顯示錯誤消息報錯了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM