一.前言

模型验证自ASP.NET MVC便有提供,我们可以在Model(DTO)的属性上加上数据注解(Data Annotations)特性,在进入Action之前便会根据数据注解,来验证输入的数据是否合法,下面介绍以下如何统一处理验证并返回错误信息。

二.Action过滤器实现统一验证

我们在判断验证状态时一般会在Action里判断ModelState.IsValid是否为true。


public IActionResult Create([FromBody]CreateOrderDto dto)
{
if(ModelState.IsValid)
{
//TODO:...
}
}

如果我们在每个需要验证的Action里面都写这个判断岂不是太麻烦,我们是否可以在进入所有的Action之前都进行验证,如果错误,就直接返回错误信息,不去执行Action了,当然时可以的。我们可以利用MVC的ActionFilter即Action过滤器,在执行Action之前统一判断处理。

1.首先定义一个通用的返回结果类:

public class XcHttpResult
{
public string Msg { get; set; } public bool Result { get; set; }
}

2.定义一个ActionFilter

public class XcActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
XcHttpResult result = new XcHttpResult() { Result = false }; foreach (var item in context.ModelState.Values)
{
foreach (var error in item.Errors)
{
result.Msg += error.ErrorMessage + "|";
}
} context.Result = new JsonResult(result);
}
} public void OnActionExecuted(ActionExecutedContext context)
{ }
}

3.配置过滤器

Startup.cs里配置过滤器,使其生效:

public void ConfigureServices(IServiceCollection services)
{ services.AddMvc(options =>
{
options.Filters.Add<XcActionFilter>();
});
}

三.测试

定义一个DTO:

public class CreateOrderDto
{
[Required(ErrorMessage = "商品ID不得为空")]
public string ProductId { get; set; } [Required(ErrorMessage = "购买商品数量不得为空")]
[Range(1, 999, ErrorMessage = "购买商品数量必须介于1~999之间")]
public int Number { get; set; } = 0; [Required(ErrorMessage = "用户ID不得为空")]
public string UserId { get; set; }
}

使用Postman来测试接口:

可以看出已经成功验证!设置了商品数量的取值范围为1~999之间,而我输入了9999被成功拦截并返回错误信息.

ASP.NET Core 添加统一模型验证处理机制的更多相关文章

  1. 从零写一个Asp.net core手脚架(模型验证)

    一个asp.net core项目,一定包含了各种的实体,在RESTful api里面,有很多的参数传递,不建立实体则大量的参数需要自定验证正确性,并且Action上面会写的密密麻麻的参数 在asp.n ...

  2. asp.net core的输入模型验证

    数据验证特性RequiredAttribute:表示数据不能为空RegularExpressionAttribute:正则校验CompareAttribute:和某个属性比较RangeAttribut ...

  3. asp.net core 3.x 身份验证-2启动阶段的配置

    注册服务.配置选项.添加身份验证方案 在Startup.ConfigureServices执行services.AddAuthentication() 注册如下服务(便于理解省略了部分辅助服务): s ...

  4. 用.Net Core控制台模拟一个ASP.Net Core的管道模型

    在我的上几篇文章中降到了asp.net core的管道模型,为了更清楚地理解asp.net core的管道,再网上学习了.Net Core控制台应用程序对其的模拟,以加深映像,同时,供大家学习参考. ...

  5. ASP.NET MVC学习之模型验证详解

    ASP.NET MVC学习之模型验证篇 2014-05-28 11:36 by y-z-f, 6722 阅读, 13 评论, 收藏, 编辑 一.学习前的一句话 在这里要先感谢那些能够点开我随笔的博友们 ...

  6. asp.net core 3.x 身份验证-3cookie身份验证原理

    概述 上两篇(asp.net core 3.x 身份验证-1涉及到的概念.asp.net core 3.x 身份验证-2启动阶段的配置)介绍了身份验证相关概念以及启动阶段的配置,本篇以cookie身份 ...

  7. .net core 中api 模型验证

    AddControllers/AddMvc方法允许添加自定义ActionFilterAttribute进行过滤 文档中这么定义Filter: 可以创建自定义筛选器,用于处理横切关注点. 横切关注点的示 ...

  8. 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权

    OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...

  9. ApiBehaviorOptions 统一模型验证配置不生效

    ApiBehaviorOptions 的统一模型验证配置一定要放到(.AddMvc)后面.

随机推荐

  1. 理解Node.js安装及模块化

    1.安装Node Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Node.j ...

  2. 面向对象进阶---attr家族

    一. isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查obj是否是类 cls 的对象 class Foo: pass ob ...

  3. django Form组件 上传文件

    上传文件 注意:FORM表单提交文件要有一个参数enctype="multipart/form-data" 普通上传: urls: url(r'^f1/',views.f1), u ...

  4. 使用一个Python脚本来运行一个简单的Django项目

    创建视图 Django是一个模型-模板-视图(model-template-view,MTV)框架. 视图部分通常检查看HTTP给出的请求和查询或者结构,这些信息是发送到表示层的数据. 我们在 hel ...

  5. CentOS 7 快速初始化脚本 for MySQL

    #!/bin/bash## CentOS 7.x # SSH configuresshd_port=22 # Disable SElinuxprintf "Disable SElinux.. ...

  6. 同主机下Docker+nginx+tomcat负载均衡集群搭建

    想用Docker模拟一下nginx+tomcat集群部署,今天折腾了一天,遇坑无数,终于在午夜即将到来之际将整个流程走通,借本文希望给同样遇到类似问题的小伙伴们留点线索. 主机环境是CentOS 7, ...

  7. [ZooKeeper] 1 基本概念

    ZooKeeper: A Distributed Coordination Service for Distributed Applications ZooKeeper is a distribute ...

  8. [LeetCode] Find Mode in Binary Search Tree 找二分搜索数的众数

    Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred ...

  9. springcloud分布式事务终极探讨

    2018阿里云全部产品优惠券(好东东,强烈推荐)领取地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userC ...

  10. SpringIOC学习三

    基于注解的注入:就是用注解标签的方式替换掉我们xml配置文件里面bean的注册和依赖关系的描述    a:首先回顾IOC(控制反转),进行依赖注入需要做到两件事情:        1:注册类  2:描 ...