zoukankan      html  css  js  c++  java
  • 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响应,最后显示错误消息报错了。

  • 相关阅读:
    U8 UAP 存储过程未提供该参数
    SQL exec 报错 找不到存储过程 'select * from TEMP_byhktb20191213104416697'
    U8修改存货扩展自定义项
    插入临时表时报在将 nvarchar 值 'config_category.metadata_item.popedom' 转换成数据类型 int 时失败
    拼接字符串发生的错误
    js 三种提取部分字符串的方法的 区别: slice(start, end) substring(start, end) substr(start, length)
    sqlserver 保留位数
    1月转01月
    焦点图插件-06
    通栏自适应通栏焦点图-05
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/10316446.html
Copyright © 2011-2022 走看看