ASP.NET Core MVC 如何获取请求的参数

简介:

ASP.NET Core MVC 如何获取请求的参数

一次HTTP请求,就是一次标准IO操作。请求是I,是输入;响应式O,是输出。任何web开发框架,其实都是在干这两件事:

接受请求并进行解析获取参数
根据参数进行渲染并输出响应内容

所以我们学习一个框架,我认为最首要的是知道如何从请求中获取参数。http请求携带参数的地方主要有下面几个地方:

URL
Header
Body
下面看看ASP.NET Core是如何从这几个位置获取参数的。
通过URL获取参数
通过URL传参是HTTP最最常用的办法。这里简单介绍下URL相关的知识。一个URL主要分成4个部分,以http://localhost:5000/fromurl/test?name=mjzhou&age=10为例:

http:// 协议
localhost:5000 主机地址
/fromurl/test PATH
name=mjzhou&age=10 QueryString
我们通常使用PATH跟QueryString来传递参数。新建一个MVC项目,新建一个Controller名为FromUrlController,通过几个Action来演示如何从URL上获取参数。

通过QuerySting获取参数
Request.Query对象

    // /fromurl/test?name=mjzhou
    public IActionResult Test()
    {
        var name = Request.Query["name"];
        return Content(name);
    }

Request.Query对象包含了本次请求的QueryString的键值对列表,所以可以通过它轻松获取QueryString上携带的参数。

自动参数绑定

    // /fromurl/test?name=mjzhou
    public IActionResult Test1(string name)
    {
        return Content(name);
    }

如果Action的型参的名称跟QueryString的Key一致,则MVC框架会自动帮我们绑定参数的值,不用手动获取。

    public IActionResult Test2([FromQuery(Name = "id")]string bh)
    {
        return Content(bh);
    }

如果参数绑定的名称跟QueryString的Key不一致,可以使用FromQueryAttribute强制指定绑定的Key的名称。

通过PATH获取参数
Request.Path对象
// /fromurl/test3

    public IActionResult Test3()
    {
        var path = Request.Path;
        return Content(path);
    }

Request.Path对象包含了本次http请求的Path的原始信息,一般可以通过/来分隔,手工获取想要的参数。

自动参数绑定
// /fromurl/Test4/mjzhou/1000

    [Route("FromUrl/test4/{name}/{id}")]
    public IActionResult Test4(string name, int id)
    {
        return Content($"{name}/{id}");
    }

Path的自动参数绑定,需要配合RouteAttribute实现,RouteAttribute主要是指定一个Path的模板,通过这个模板可以告诉路由是否匹配这个Action,另外一个就是可以告诉参数绑定,如何解析这个path实现参数绑定。

    [Route("FromUrl/test6/{name}/{id}")]
    public IActionResult Test6([FromRoute(Name ="name")]string xm, [FromRoute(Name = "id")]int bh)
    {
        return Content($"{xm}/{bh}");
    }

如果Action的型参名称跟RouteAttribute模板的中的名称不一样,那么可以使用FromRoute强制指定解析的名称。

    [HttpGet("FromUrl/test5/{name}/{id}")]
    public IActionResult Test5(string name, int id)
    {
        return Content($"{name}/{id}");
    }

HttpGetAttribute、HttpPostAttribute等attribute同样可以完成RouteAttribute的效果,而且还指定了action接受的HTTP Method的方法,可以说是加强版的RouteAttribute。

从Header上获取参数
添加一个FromHeaderController,通过几个action来演示如果从http headers上获取参数。

Request.Headers对象

    // /FromHeader/test
    public IActionResult Test()
    {
        var myName = Request.Headers["myName"];

        return Content(myName);
    }

Request.Headers是一个字典,包含了本次请求的Headers。所以我们可以通过Request.Headers对象轻松获取某个header的值。

自动参数绑定

    public IActionResult Test1([FromHeader]string myName)
    {
        return Content(myName);
    }

通过在action的型参上打上FromHeaderAttribute,可以告诉框架自动从header获取参数。

    public IActionResult Test2([FromHeader(Name = "myName")]string name)
    {
        return Content(name);
    }

如果action的型参跟header的key值不一致,可以通过FromHeaderAttribute强制指定匹配的header的key值。

从Body获取参数
我们开发的时候经常通过表单提交数据,或者通过AJAX往后台提交一个JavaScript对象,本质上这些数据都是通过HTTP的Bady提交回去的。新建一个FromBodyController控制器,通过几个Action来演示如何获取Body的参数。

Request.Body对象

    public class model1
    {
        public string NAME { get; set; }
    }

    public async Task<IActionResult> Test()
    {
        Request.EnableBuffering();

        string body = "";
        var stream = Request.Body;
        if (stream != null)
        {
            stream.Seek(0, SeekOrigin.Begin);
            using (var reader = new StreamReader(stream, Encoding.UTF8, true, 1024, true))
            {
                body = await reader.ReadToEndAsync();
            }
            stream.Seek(0, SeekOrigin.Begin);
        }

        var model = JsonConvert.DeserializeObject<model1>(body);

        return Content(model.NAME);
    }

Request.Body是一个Stream,保存了本次请求的body数据。所以我们只要把这个stream读出来,就能获取提交的数据。有了原始的数据,就可以通过反序列化等操作转换为模型,更简单的获取参数了。注意,ASP.NET Core想要读取这个对象,必须先调用Request.EnableBuffering()这个方法。
使用postman测试一下:

参数自动绑定

    public IActionResult Test1([FromBody]model1 model)
    {
        return Content(model.NAME);
    }

使用FromBodyAttribute可以把body的数据自动反序列化成型参的模型。但是请注意使用[FromBody]请求的Content-Type必须是application-json。
使用postman测试下:

    public IActionResult Test2([FromForm]model1 model)
    {
        return Content(model.NAME);
    }

使用FromFormAttribute可以把body的数据自动反序列化成型参的模型。但是请注意使用[FromForm]请求的Content-Type必须是application/x-www-form-urlencoded。
使用postman测试下:

总结
ASP.NET Core获取请求参数主要从URL,Headers,Body等位置获取。我们可以通过Request.Query、Request.Headers、Request.Body来手工获取数据。也可以通过[FromQuery]、[FromHeader]、[Frombody]等Attribute来实现参数的自动绑定。

作者:Agile.Zhou(kklldog)
出处:http://www.cnblogs.com/kklldog/

相关文章
|
3月前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
71 0
|
3月前
|
开发框架 .NET
ASP.NET Core NET7 增加session的方法
ASP.NET Core NET7 增加session的方法
37 0
|
3月前
|
开发框架 JavaScript .NET
ASP.NET Core的超级大BUG
ASP.NET Core的超级大BUG
43 0
|
1月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
29 0
|
1月前
mvc.net分页查询案例——mvc-paper.css
mvc.net分页查询案例——mvc-paper.css
5 0
|
1月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
65 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
100 5
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
42 0
|
8月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
117 0
|
9月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
67 0