ASP.NET Core MVC 2.1 顶级参数验证

本文讨论ASP.NET Core 2.1中与ASP.NET Core MVC / Web API控制器中的模型绑定相关的功能。虽说这是一个功能,但从我的角度来看,它更像是一个错误修复!

请注意,我使用的是 NET Core 2.1 Preview 1,正式版发布后,功能可能存在变动。

ASP.NET Core 2.0 模型验证

模型验证是ASP.NET Core MVC 管线的重要组成部分。有很多方法可以注入到验证层(例如使用FluentValidation),最常见的方法可能是使用来自System.ComponentModel的验证标记来修饰绑定模型。 例如:

public class UserModel  {[Required, EmailAddress]  
 public string Email { get; set; }[Required, StringLength(1000)]  
public string Name { get; set; } }

如果您在控制器的操作方法中使用UserModel,MvcMiddleware则会自动创建对象的新实例,绑定模型的属性并使用如下三个来源对其进行验证:

  1. 表单 - 当使用POST将表单发送到服务器时,发送到HTTP请求的主体中;

  2. 路由 - 在匹配路由后从URL段或默认值中获取;

  3. 查询字符串 - 在URL的末尾传递。

请注意,目前,作为JSON发送的数据默认情况下不会被绑定。如果您希望绑定请求体中的JSON数据,则需要使用此处所述的[FromBody]标记修饰模型。

在控制器Action方法中,可以简单地检查ModelState属性,确定提供的数据是否有效:

public class CheckoutController : Controller  {    
public IActionResult SaveUser(UserModel model)    {    
   if(!ModelState.IsValid){            // Something wasn't valid on the modelreturn View(model);}        // The model passed validation, do something with it} }

这是非常标准的MVC内容,但是如果您不想创建整个绑定模型,但仍想验证传入数据,该怎么办?

ASP.NET Core 2.0 顶级参数

DataAnnotation标记默认MVC验证系统使用的属性不必应用于类的属性,它们也可以应用于参数。这可能会导致您认为您可以完全替换UserModel上面的示例中的以下内容:

MVC默认验证系统使用的DataAnnotation标记不一定应用于类的属性,它们同样可以应用于参数。这可能会导致您认为可以完全替换上面示例中的UserModel,如下所示:

public class CheckoutController : Controller  {  
 public IActionResult SaveUser([Required, EmailAddress] string Email [Required, StringLength(1000)] string Name)  
   {    
    if(!ModelState.IsValid){            // Something wasn't valid on the modelreturn View(model);}        // The model passed validation, do something with it} }

不幸的是,这是行不通的!在绑定属性时,验证属性将被忽略,并且ModelState.IsValid始终是true!

ASP.NET Core 2.1中的顶级参数

幸运的是,ASP.NET Core团队意识到了这个问题,并且已经将修补程序合并为ASP.NET Core 2.1的一部分。因此,上一节中的代码的行为与您所期望的一样,参数经过验证,并相应地进行了ModelState.IsValid更新。

作为这项工作的一部分,您现在还可以使用[BindRequired]标记修饰参数。当绑定非空值类型时,此标记很重要,因为使用[Required]标记对这些属性并不能提供预期的行为。

这意味着您现在可以执行以下操作,并确保testId参数已从路由参数中正确绑定,并且qty参数已从查询字符串中绑定。在ASP.NET Core 2.1之前,它甚至不能编译!

[HttpGet("test/{testId}")]
public IActionResult Get([BindRequired, FromRoute] Guid testId, [BindRequired, FromQuery] int qty)  {    if(!ModelState.IsValid){        return BadRequest(ModelState);}    // Valid and bound}

对于这个问题可以查阅我之前的博客:《ASP.NET Core MVC中的 [Required]与[BindRequired]》。

总结

在ASP.NET Core 2.0及以下版本中,应用于顶级参数的验证标记将被忽略,并且ModelState不会更新。只考虑复杂模型类型的验证参数。

在ASP.NET Core 2.1中,验证标记现在将在顶级参数上得到遵守。更重要的是,您可以将[BindReqired]标记应用于参数。

ASP.NET Core 2.1 增加了很多新特性。这是一些不错的小改进之一,它使事情变得更容易,更一致 -- 我喜欢这种改变。

翻译自https://andrewlock.net/coming-in-asp-net-core-2-1-top-level-mvc-parameter-validation/。


原文地址:https://www.cnblogs.com/tdfblog/p/asp-net-core-2-1-top-level-mvc-parameter-validation.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321815.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net core2.0下Ioc容器Autofac使用

Autofac基本使用Autofac是一款轻量级的IOC框架,使用率上还是挺高的,官方网站http://autofac.org,源码下载地址https://github.com/autofac/Autofac。下面以狗的列子来介绍autofac,nuget搜索Autofac进行安装public interface IDog{…

微软重组变两大事业部:Windows主管离职

微软CEO纳德拉通过内部邮件宣布,整个公司进行重大重组,划分为两个新的事业部(部门),同时Windows业务主管Terry Myerson(特里梅尔森)将离开微软。Terry Myerson最为人诟病的就是推倒了Windows Mobile而打造全新的Windows Phone,结果…

41、java应用占用cpu过高原因分析

线上服务器cpu占用过高问题排查 1、定位最耗cpu的进程 命令:top 2、定位最耗cpu的线程 命令:Top –Hp PID 例如:Top –Hp 12086 3、打印线程堆栈信息 命令:Printf ‘%x\n’ PID 例如:printf ‘%x\n’ 12118 先将…

Google Optimization Tools介绍

Google Optimization Tools(OR-Tools)是一款专门快速而便携地解决组合优化问题的套件。它包含了:约束编程求解器。简单而统一的接口,用于多种线性规划和混合整数规划求解,包括 CBC、CLP、GLOP、GLPK、Gurobi、CPLEX 和SCIP。图算法 (最短路径…

11、mysql数据表中数据的查询(3)

说一下子查询,子查询的意义就是使用一个查询语句做为另一个查询语句的条件,一般使用exists和in来引导子查询 exists子查询 exists 放在 where 之后使用,可以看成查询数据所满足的一个条件,只是这个条件的值比较特殊(…

使用.Net Core与Google Optimization Tools实现员工排班计划Scheduling

上一篇说完《Google Optimization Tools介绍》,让大家初步了解了Google Optimization Tools是一款约束求解(CP)的高效套件。那么我们用.Net Core与Google Optimization Tools来实现一个有关员工排班计划的场景感受一下。众所周知,…

42、Java服务内存OOM原因分析

1、出现问题的可能原因 对于应用来说内存分配太少 对象创建太多,又没有释放,造成内存泄漏严重,导致内存耗尽 申请太多的系统资源,系统资源耗尽。例如:不断创建线程,不断发起网络连接 2、如何定位问题&a…

Slickflow.NET 开源工作流引擎基础介绍-.NET Core2.0 版本实现介绍

前言:.NET Core 是.NET Framework的新一代版本,是微软开发的第一个跨平台 (Windows、Mac OSX、Linux) 的应用程序开发框架(Application Framework),未来也将会支持 FreeBSD 与 Alpine 平台。.Net Core也是微软在一开始…

DotNetty 跨平台的网络通信库

久以来,.Net开发人员都非常羡慕Java有Netty这样,高效,稳定又易用的网络通信基础框架。终于微软的Azure团队,使用C#实现的Netty的版本发布。不但使用了C#和.Net平台的技术特点,并且保留了Netty原来绝大部分的编程接口。让我们在使用…

26、临时表的创建和重复数据的处理

UPDATE student b SET b.sname dd WHERE b.id (SELECT a.id FROM student a WHERE a.id 3) Mysql中根据条件(表A中的字段)操作表A中的数据时是不可以的 所以借助临时表来删除/更新重复的数据,原理就是删除每组重复数据中除id值最大的其他…

1、java简介

关于java介绍也没什么好说的,在这里简单介绍一下,说起java,我第一想到的就是它的简单和强大,简单是简单易学,开发速度快;强大是其功能强大,各个领域都可使用,其代码一次编译可以处处…

C# 观察者模式 以及 delegate 和 event

观察者模式这里面综合了几本书的资料.需求有这么个项目: 需求是这样的:一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, 它能从气象站获得这三个数据. 还有三种设备, 可以按要求展示气象站的最新数据.WeatherData的结构如下:有3个get方法, 分别获取最新的…

2、JAVA开发环境的搭建

上次说到java应用之所以做到跨平台,是因为其依赖于java虚拟机,java想要运行需要依赖于特定的运行环境,称为JRE,如果想要开发java应用,则需要用到开发工具包,也就是JDK,所以这里就要说一下这几者…

Serilog Tutorial

在过去的几年中,结构化日志已经大受欢迎。而Serilog是 .NET 中最著名的结构化日志类库 ,我们提供了这份的精简指南来帮助你快速了解并运用它。0. 内容设定目标认识Serilog事件和级别触发和收集结构化数据为过滤和关联添加事件标记大海捞针 [Finding needles in the …

使用DDD、事件风暴和Actor来设计反应式系统

领域驱动设计(domain-driven design,DDD)通常在微服务领域用于查找边界(限界上下文)。同样来自DDD的聚合(aggregate)对于定义持久化和一致性的范围来讲也是很重要的。 但是,并不是领…

站在巨人肩上的.NET Core 2.1

.NET Core 1.0自发布两年以来,得到了开发者群体相当高地认可。 下图来自Stack overflow survey 2018的统计:.NET Core已经成为前五的主流框架工具,现今借鉴了优秀的设计原则和开发体验可谓站在巨人肩上。这一切归功于.NET团队认识和总结了大量…

5、java中的数组

1、简介 数组是一种具有随机存取特性的数据结构,是内存上一段连续区域的表示,是实现顺序存储的基础,数组只能用于存储同一类型的数据。数组的长度在初始化时定义之后就不可更改,并且在初始化数组时必须指定数组的长度。 2、数组…

动态规划训练19、最短路 [Help Jimmy POJ - 1661 ]

Help Jimmy POJ - 1661 题意:大致是一个人从某个点开始下落,下落的速度是1m/s,然后在平台上的时候可以左右移动,移动的速度也是1m/s,但是这里有一个限制,就是说每次下落的距离不能超过一个给定的数值。问你…

【活动(北京)】Global Azure Bootcamp

活动议程活动内容08:30-08:50报到08:50-09:10活動开场Study4 - 陈科融(MVP)STB Chain Foundation - 劉海峰(MVP)MVP Program - Christina Liang(MVP CPM)09:10-10:00区块链让软件资产化成为现实刘海峰(MVP) - STBChain Foundation主席10:10-11:00基于Azure PaaS的网站应用刘元纶…

6、java中的排序算法

1、简介 排序是将元素按着指定关键字的大小递增或递减进行数据的排列,排序可以提高查找的效率 2、排序算法的分类 排序算法可大致分为四类七种,具体分类如下: 插入排序:直接插入排序、希尔排序 交换排序:冒泡排序、…