ASP.NET Core MVC中URL和数据模型的匹配
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¤tPage=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¤tPage=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¤tPage=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和数据模型的匹配的更多相关文章
- ASP.NET MVC和ASP.NET Core MVC中获取当前URL/Controller/Action (转载)
ASP.NET MVC 一.获取URL(ASP.NET通用): [1]获取完整url(协议名+域名+虚拟目录名+文件名+参数) string url=Request.Url.ToString(); [ ...
- 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 ...
- 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. ...
- 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 ...
- ASP.NET Core MVC中Controller的Action,默认既支持HttpGet,又支持HttpPost
我们知道ASP.NET Core MVC中Controller的Action上可以声明HttpGet和HttpPost特性标签,来限制可以访问Action的Http请求类型(GET.POST等). 那 ...
- ASP.NET Core MVC中的IActionFilter.OnActionExecuted方法执行时,Controller中Action返回的对象是否已经输出到Http Response中
我们在ASP.NET Core MVC项目中有如下HomeController: using Microsoft.AspNetCore.Mvc; namespace AspNetCoreActionF ...
- ASP.NET Core MVC中Controller的Action如何直接使用Response.Body的Stream流输出数据
在ASP.NET Core MVC中,我们有时候需要在Controller的Action中直接输出数据到Response.Body这个Stream流中,例如如果我们要输出一个很大的文件到客户端浏览器让 ...
- ASP.NET Core MVC 中的 [Controller] 和 [NonController]
前言 我们知道,在 MVC 应用程序中,有一部分约定的内容.其中关于 Controller 的约定是这样的. 每个 Controller 类的名字以 Controller 结尾,并且放置在 Contr ...
- ASP.NET Core MVC 中设置全局异常处理方式
在asp.net core mvc中,如果有未处理的异常发生后,会返回http500错误,对于最终用户来说,显然不是特别友好.那如何对于这些未处理的异常显示统一的错误提示页面呢? 在asp.net c ...
随机推荐
- Linux LB--负载均衡和高可靠
1.负载均衡典型应用场景,外网.内网.私网公共服务. 典型场景: (1)用户通过公网访问数据中心的ftp.web.https服务器. (2) 在数据中心内部东西向访问其他服务时,例如,访问其他虚拟机. ...
- Expo大作战(三十)--expo sdk api之Permissions(权限管理模块),Pedometer(计步器api)
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- springboot 学习之路 20 (整合RabbitMQ)
整合RabbitMQ: 我的操作系统是window7 ,所以在整合ribbotMQ之前需要先安装rabbitMq服务:安装步骤请参考:window下安装RabbitMQ 这个详细介绍了安装步骤,请按 ...
- recovery 恢复出厂设置失败Data wipe failed
最近客户反馈,编译32位的android系统,在recovery中执行恢复出厂设置的时候失败了,失败的打印提升信息如下. Formatting /data... [ 2.191404] E:get_f ...
- SQL Server的一个不显眼的功能 备份文件的分割
SQL Server的一个不显眼的功能 备份文件的分割 当完整备份数据库的时候,我们有时候可能会遇到一种极端情况,比如服务器上C,D,E三个盘符都只剩下5G空间了 但是如果要完整备份业务库需要12G的 ...
- js判断IE浏览器及版本
function isIE(_version){ _version = _version || ''; var b = document.createElement('b'); b.innerHTML ...
- python第十六天,昨天来晚了,作业终于完成了
作业 1: 员工信息表程序,实现增删改查操作 可进行模糊查询,语法至少支持下面3种: select name,age from staff_table where age > 22 select ...
- C#语言————第一章 第一个C#程序
第一章 第一个C#程序 ******************C#程序*************** ①:建立项目:文件-->新建-->项目-->c#-->控制台程 ...
- Linux远程访问及控制(SSH)
1.ssh协议:用于远程登录,端口号:22/tcp 配置文件: 1)服务器端口:/etc/ssh/sshd_config 2)客户端 :/etc/ssh/ssh_config 2.服务器监听选项: U ...
- Kali Linux 初始化配置:Apache2 /SSH /FTP
Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统.Kali Linux预装了许多渗透测试软件,包括nmap .Wireshark .John the Ripper, ...