Http GET方法


首先我们来看看GET方法的Http请求,URL参数和ASP.NET Core MVC中Controller的Action方法参数匹配情况。

我定义一个UserController,其中有一个只接受GET请求的Action方法GetDataInPage

public class UserController : Controller
{
[HttpGet]
public IActionResult GetDataInPage(string languageCode, int currentPage, int pageSize)
{
return View();
}
}

GetDataInPage方法有三个参数,那么接下来我们如果在Http请求的URL中不完全提供这三个参数的值,我们来看看会发生什么。

首先我们用如下URL,只提供currentPage和pageSize参数的值

http://localhost:9081/User/GetDataInPage?currentPage=5&pageSize=20

我们会发现,UserController的GetDataInPage方法可以成功执行,其中:

  • languageCode参数为null
  • currentPage参数为5
  • pageSize参数为20

这说明如果在URL参数中,缺少languageCode参数是没有问题的,UserController的GetDataInPage方法可以被执行。

接下来如果我们在如下URL中,只提供languageCode和currentPage参数的值

http://localhost:9081/User/GetDataInPage?languageCode=CN&currentPage=5

我们会发现,UserController的GetDataInPage方法也可以成功执行,其中:

  • languageCode参数为CN
  • currentPage参数为5
  • pageSize参数为0

可以看到即便是我们没在URL参数中提供pageSize参数,但是pageSize参数在UserController的GetDataInPage方法也被初始化为0了,并没有妨碍UserController的GetDataInPage方法执行。

接下来如果我们在如下URL中,什么参数都不提供

http://localhost:9081/User/GetDataInPage

我们会发现,UserController的GetDataInPage方法也可以成功执行,其中:

  • languageCode参数为null
  • currentPage参数为0
  • pageSize参数为0

我们看到这次UserController的GetDataInPage方法还是被执行了,但是其三个参数都没有从URL中获取到值,不得不说ASP.NET Core MVC的模型绑定机制包容性还是很强的,这次我们一个URL参数都没有提供,UserController的GetDataInPage方法还是被执行了。

接下来如果我们在如下URL中,给参数pageSize提供错误的数据类型

http://localhost:9081/User/GetDataInPage?languageCode=CN&currentPage=5&pageSize=ABC

可以看到,UserController的GetDataInPage方法要求pageSize参数是int类型,但是我们却在URL参数中提供的是字符ABC,这种情况下UserController的GetDataInPage方法还是可以被执行,其中:

  • languageCode参数为CN
  • currentPage参数为5
  • pageSize参数为0

可以看到ASP.NET Core MVC直接忽略掉了URL参数中的pageSize=ABC,将UserController中GetDataInPage方法的pageSize参数设置为了0

接下来如果我们在如下URL中,提供多余的URL参数message和number

http://localhost:9081/User/GetDataInPage?languageCode=CN&currentPage=5&pageSize=10&message=ABC&number=100

我们会发现,UserController的GetDataInPage方法也可以成功执行,其中:

  • languageCode参数为CN
  • currentPage参数为5
  • pageSize参数为10

可以看到多余的URL参数message和number,不会对UserController的GetDataInPage方法造成影响,GetDataInPage方法还是被成功执行了。

Http POST方法


接下来,我们来用POST方法的Http请求,看看和ASP.NET Core MVC中Controller的Action方法参数匹配情况。

我们将UserController稍作更改,在其内部定义了一个只接受POST请求的Action方法AddUser,注意我们给AddUser方法的UserModel user参数前面加上了[FromBody]标签特性,说明UserModel user参数会从Http请求的Body中获取Json数据来进行模型绑定

public class UserController : Controller
{
[HttpPost]
public IActionResult AddUser([FromBody]UserModel user)
{
return View();
}
}

其中AddUser方法的参数UserModel定义如下

public class UserModel
{
public string UserCode { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string LanguageCode { get; set; }
public string MailAddress { get; set; }
public IList<string> RoleCodes { get; set; }
public int Status { get; set; }
}

然后我们用POST方法的Http请求,发送Json数据到如下URL

http://localhost:9081/User/AddUser

其中Json数据只给UserModel类的UserCode、Username和Status属性赋值

{
"userCode": "U001",
"username": "James",
"status": 1
}

我们会发现,UserController的AddUser方法可以被执行,其中UserModel user参数的属性如下:

  • UserCode参数为U001
  • Username参数为James
  • Password参数为null
  • LanguageCode参数为null
  • MailAddress参数为null
  • RoleCodes参数为null
  • Status参数为1

可以看到Json数据提供的三个属性UserCode、Username和Status都有值,其余属性都为null

然后我们用POST方法的Http请求,发送Json数据到如下URL

http://localhost:9081/User/AddUser

这一次Json数据什么都不提供,我们发一个空的Json对象到UserController的AddUser方法

{}

我们会发现,UserController的AddUser方法可以被执行,其中UserModel user参数的属性如下:

  • UserCode参数为null
  • Username参数为null
  • Password参数为null
  • LanguageCode参数为null
  • MailAddress参数为null
  • RoleCodes参数为null
  • Status参数为0

我们发现在Json数据什么都没提供的情况下,UserController的AddUser方法还是被成功执行了,再次说明了ASP.NET Core MVC的模型绑定机制包容性很强

接下来我们用POST方法的Http请求,发送Json数据到如下URL

http://localhost:9081/User/AddUser

这一次Json数据提供错误的数据类型,我们知道UserModel类的Status属性为int类型,我们这次在Json中给Status属性赋值字符串ABC,如下所示

{
"userCode": "U001",
"username": "James",
"status": "ABC"
}

这次UserController的AddUser方法可以被执行,但是我们发现AddUser方法的参数UserModel user整个变为了null:

应该是由于UserModel类的Status属性匹配Json数据失败导致的

接下来我们用POST方法的Http请求,发送Json数据到如下URL

http://localhost:9081/User/AddUser

这一次我们在Json数据中,提供两个在UserModel类中不存在的属性message和number:

{
"userCode": "U001",
"username": "James",
"status": 1,
"message": "ABC",
"number": 100
}

我们会发现,UserController的AddUser方法可以被执行,其中UserModel user参数的属性如下:

  • UserCode参数为U001
  • Username参数为James
  • Password参数为null
  • LanguageCode参数为null
  • MailAddress参数为null
  • RoleCodes参数为null
  • Status参数为1

所以Json数据中多余的两个属性message和number不会对UserController的AddUser方法造成什么影响

接下来我们对UserController的AddUser方法做些修改,在参数UserModel user后,再增加两个参数message和number

public class UserController : Controller
{
[HttpPost]
public IActionResult AddUser([FromBody]UserModel user, string message, int number)
{
return View();
}
}

其中参数message和number从URL参数中获取值

然后我们用POST方法的Http请求,发送Json数据到如下URL,可以看到URL参数中带有message和number的值

http://localhost:9081/User/AddUser?message=ABC&number=100

其中Json数据只给UserModel类的UserCode、Username和Status属性赋值

{
"userCode": "U001",
"username": "James",
"status": 1
}

我们会发现,UserController的AddUser方法可以被执行,其中UserModel user参数的属性如下:

  • UserCode参数为U001
  • Username参数为James
  • Password参数为null
  • LanguageCode参数为null
  • MailAddress参数为null
  • RoleCodes参数为null
  • Status参数为1

然后UserController中AddUser方法的message和number参数值如下:

  • message参数为ABC
  • number参数为100

所以我们可以在UserController的AddUser方法中,既定义从Http请求Body中获取值的参数UserModel user,又定义从Http请求URL中获取值的参数message和number,只要在Http请求中提供了数据,UserController中AddUser方法的所有参数都可以被正确地赋值

ASP.NET Core MVC中URL和数据模型的匹配的更多相关文章

  1. ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action (转载)

    ASP.NET MVC 一.获取URL(ASP.NET通用): [1]获取完整url(协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [ ...

  2. 006.Adding a controller to a ASP.NET Core MVC app with Visual Studio -- 【在asp.net core mvc 中添加一个控制器】

    Adding a controller to a ASP.NET Core MVC app with Visual Studio 在asp.net core mvc 中添加一个控制器 2017-2-2 ...

  3. 008.Adding a model to an ASP.NET Core MVC app --【在 asp.net core mvc 中添加一个model (模型)】

    Adding a model to an ASP.NET Core MVC app在 asp.net core mvc 中添加一个model (模型)2017-3-30 8 分钟阅读时长 本文内容1. ...

  4. 007.Adding a view to an ASP.NET Core MVC app -- 【在asp.net core mvc中添加视图】

    Adding a view to an ASP.NET Core MVC app 在asp.net core mvc中添加视图 2017-3-4 7 分钟阅读时长 本文内容 1.Changing vi ...

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

    我们知道ASP.NET Core MVC中Controller的Action上可以声明HttpGet和HttpPost特性标签,来限制可以访问Action的Http请求类型(GET.POST等). 那 ...

  6. ASP.NET Core MVC中的IActionFilter.OnActionExecuted方法执行时,Controller中Action返回的对象是否已经输出到Http Response中

    我们在ASP.NET Core MVC项目中有如下HomeController: using Microsoft.AspNetCore.Mvc; namespace AspNetCoreActionF ...

  7. ASP.NET Core MVC中Controller的Action如何直接使用Response.Body的Stream流输出数据

    在ASP.NET Core MVC中,我们有时候需要在Controller的Action中直接输出数据到Response.Body这个Stream流中,例如如果我们要输出一个很大的文件到客户端浏览器让 ...

  8. ASP.NET Core MVC 中的 [Controller] 和 [NonController]

    前言 我们知道,在 MVC 应用程序中,有一部分约定的内容.其中关于 Controller 的约定是这样的. 每个 Controller 类的名字以 Controller 结尾,并且放置在 Contr ...

  9. ASP.NET Core MVC 中设置全局异常处理方式

    在asp.net core mvc中,如果有未处理的异常发生后,会返回http500错误,对于最终用户来说,显然不是特别友好.那如何对于这些未处理的异常显示统一的错误提示页面呢? 在asp.net c ...

随机推荐

  1. 基础篇|一文搞懂RNN(循环神经网络)

    基础篇|一文搞懂RNN(循环神经网络) https://mp.weixin.qq.com/s/va1gmavl2ZESgnM7biORQg 神经网络基础 神经网络可以当做是能够拟合任意函数的黑盒子,只 ...

  2. mysql从入门到放弃-入门知识介绍

    数据库在互联网网站的重要性 简单地说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构来组织和存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据.由于数据库不易扩展,所以,在一个互 ...

  3. 使Volley完美支持自定义证书的Https

    其实在最早的版本里,Volley甚至是不支持https协议的,只能跑http,当然你也可以自己修改他的源码让他支持,如今volley的代码经过一些改进以后, 已经可以完美支持https协议了,无论是在 ...

  4. Storm的DRPC

    RPC:Remote Procedure Call DRPC:Distributed RPC Hadoop提供了RPC的实现机制,实现方法见:<>,本文主要介绍Storm的DRPC.   ...

  5. linux网络 skb_buff

    sbk_buff中的data_len指的是尾部带的page数据的长度,len指的是总共的data的长度,len-data_len是第一个线性buf的数据长度. sk_buff->len:表示当前 ...

  6. java web中java和python混合使用

    利用java web技术展示python算法处理后的数据 工具/原料   myeclipse10 pycharm+Anaconda2 方法/步骤     首先安装配置好pycharm+Anaconda ...

  7. 实战:阿里巴巴 DevOps 转型后的运维平台建设

    导读:阿里巴巴DevOps转型之后,运维平台是如何建设的?阿里巴巴高级技术专家陈喻结合运维自身的理解,业务场景的分析和业界方法论的一些思考,得出来一些最佳实践分享给大家.   前言   “我是这个应用 ...

  8. 开启远程Windows系统3389端口

    1.Win7.Win2003.XP系统REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDen ...

  9. MATLAB数值积分法

    MATLAB数值积分法 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 一.实验目的 许多工程技术和数学研究中要用到定积分,如果无法直接算不出精确值(如含 ...

  10. 装饰器 以及 django 中的应用

    装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权 ...