手把手教你AspNetCore WebApi数据验证的实现

 更新时间:2020年10月12日 09:58:03   作者:深度码农  
这篇文章主要介绍了手把手教你AspNetCore WebApi数据验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

小明最近又遇到麻烦了,小红希望对接接口传送的数据进行验证,既然是小红要求,那小明说什么都得满足呀,这还不简单嘛。

传统验证

[HttpPost]
public async Task<ActionResult<Todo>> PostTodo(Todo todo)
{
  if (string.IsNullOrEmpty(todo.Name))
  {
    return Ok("名称不能为空");
  }
  context.Todo.Add(todo);
  await context.SaveChangesAsync();

  return CreatedAtAction("GetTodo", new { id = todo.Id }, todo);
}

小明写着写着发现这样写,很多接口相同得地方都要写,使得代码比较臃肿。

使用模型验证

在参数模型上打上注解

namespace App001.Models
{
  /// <summary>
  /// 待办事项
  /// </summary>
  public class Todo
  {
    /// <summary>
    /// ID
    /// </summary>
    public Guid Id { get; set; }
    /// <summary>
    /// 名称
    /// </summary>
    [Required(ErrorMessage = "名称不能为空")]
    public string Name { get; set; }
  }
}

Postman测试Name传值未空时,则返回:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "|df184e36-4e11844dfd38a626.",
  "errors": {
    "Name": [
      "名称不能为空"
    ]
  }
}

注意Web API 控制器具有 [ApiController] 特性,则它们不必检查ModelState.IsValid。在此情况下,如果模型状态无效,将返回包含错误详细信息的自动 HTTP 400 响应。

内置特性

  • [CreditCard]:验证属性是否具有信用卡格式。
  • [Compare]:验证模型中的两个属性是否匹配。
  • [EmailAddress]:验证属性是否具有电子邮件格式。
  • [Phone]:验证属性是否具有电话号码格式。
  • [Range]:验证属性值是否在指定的范围内。
  • [RegularExpression]:验证属性值是否与指定的正则表达式匹配。
  • [Required]:验证字段是否不为 null。
  • [StringLength]:验证字符串属性值是否不超过指定长度限制。
  • [Url]:验证属性是否具有 URL 格式。
  • [Remote]:通过在服务器上调用操作方法来验证客户端上的输入。

Error messages

通过验证特性可以指定要为无效输入显示的错误消息。 例如:

[Required(ErrorMessage = "名称不能为空")]

使用自定义返回消息格式

有两种方式:

  • 使用自定义过滤器
  • 使用默认模型验证,需要在控制器上面加上【ApiController】。

使用自定义过滤器

首先,创建ModelValidateActionFilterAttribute过滤器。

public class ModelValidateActionFilterAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(ActionExecutingContext context)
  {
    if (!context.ModelState.IsValid)
    {
      //获取验证失败的模型字段
      var errors = context.ModelState
        .Where(e => e.Value.Errors.Count > 0)
        .Select(e => e.Value.Errors.First().ErrorMessage)
        .ToList();

      var str = string.Join("|", errors);

      //设置返回内容
      var result = new
      {
        Code = 10000,
        Msg = "未通过数据验证。",
        FullMsg = str
      };

      context.Result = new BadRequestObjectResult(result);
    }

  }
}

然后,Startup.ConfigureServices将过滤器添加到控制器中并关闭默认模型验证,另外我们还添加了AddNewtonsoftJson。

//关闭默认模型验证
services.Configure<ApiBehaviorOptions>(opt => opt.SuppressModelStateInvalidFilter = true);
services.AddControllers(opt =>
{
  //添加过滤器
  opt.Filters.Add(typeof(ModelValidateActionFilterAttribute));
}).AddNewtonsoftJson(opt =>
{
  //json字符串大小写原样输出
  opt.SerializerSettings.ContractResolver = new DefaultContractResolver();
});

最后,我们看一下返回效果:

{
  "Code": 10000,
  "Msg": "未通过数据验证。",
  "FullMsg": "名称不能为空。"
}

使用默认模型验证

services.Configure<ApiBehaviorOptions>(opt =>
{
  opt.InvalidModelStateResponseFactory = actionContext =>
  {
    //获取验证失败的模型字段 
    var errors = actionContext.ModelState
      .Where(e => e.Value.Errors.Count > 0)
      .Select(e => e.Value.Errors.First().ErrorMessage)
      .ToList();

    var str = string.Join("|", errors);

    //设置返回内容
    var result = new
    {
      Code = 10000,
      Msg = "未通过数据验证。",
      FullMsg = str
    };

    return new BadRequestObjectResult(result);
  };
});

小结

目前为止,小明把数据验证也搞定了,是不是so easy!

到此这篇关于手把手教你AspNetCore WebApi数据验证的实现的文章就介绍到这了,更多相关AspNetCore WebApi数据验证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • asp.net与Discuz!NT整合集成实例教程

    asp.net与Discuz!NT整合集成实例教程

    由于项目需要一个论坛,本来有CS的,在.net下很出名的国外开源论坛。但为了适应国内的风气,最后选用在国内如日中天的Discuz!NT。将Discuz与asp.net开发的网站整合,有很多人已经完成了。
    2009-11-11
  • C#中遍历各类数据集合的方法总结

    C#中遍历各类数据集合的方法总结

    C#中遍历各类数据集合的方法,这里自己做下总结:枚举类型、遍历ArrayList(Queue、Stack)、Winform窗体中的控件、HashTable哈希表等等,具体祥看下文
    2013-05-05
  • 如何合并多个 .NET 程序集

    如何合并多个 .NET 程序集

    这篇文章主要介绍了如何合并多个 .NET 程序集的方法,大家可能都听说过项 ILMerge, SmartAssembly, 等这样的工具.但是我想如果我们就能通过在编译时将所有这些源代码文件导入一个项目,来获得这些东西的一个完美组合.下面我们就来仔细探讨下。
    2015-03-03
  • ASP.NET ashx实现无刷新页面生成验证码

    ASP.NET ashx实现无刷新页面生成验证码

    这篇文章主要为大家详细介绍了ASP.NET ashx实现无刷新页面生成验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • .NET使用js制作百度搜索下拉提示效果(不是局部刷新)实现思路

    .NET使用js制作百度搜索下拉提示效果(不是局部刷新)实现思路

    搞了个不是局部刷新的百度搜索框下拉提示效果大致思路:前台放一个input标签,然后当该标签内的值输入有变化的时候,调用后台代码查询 符合条件的数据绑定ListBox,感兴趣的朋友可以了解下
    2013-01-01
  • ASP.net Menu控件在Google Chrome和Safari浏览器下显示错位的解决办法

    ASP.net Menu控件在Google Chrome和Safari浏览器下显示错位的解决办法

    在ASP.NET网站项目中添加Others.browser内容如下
    2009-05-05
  • asp.NET 脏字过滤算法 修改版

    asp.NET 脏字过滤算法 修改版

    我们网站的脏字字典中大概有600多个词,而且会发生变化,因此简单的在数据新增/修改的时候做一次脏字过滤是不够的。在网站从.NET 1.1到2.0改版的时候,对新版的测试发现旧的脏字过滤算法耗费的时间过长,需要做一些优化。
    2009-10-10
  • CKEditor自定义按钮插入服务端图片

    CKEditor自定义按钮插入服务端图片

    这篇文章主要为大家详细介绍了CKEditor自定义按钮插入服务端图片的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • .NET8 依赖注入

    .NET8 依赖注入

    依赖注入是一种设计模式,用于解耦组件(服务)之间的依赖关系,它通过将依赖关系的创建和管理交给外部容器来实现,而不是在组件(服务)内部直接创建依赖对象,本文介绍.NET8 依赖注入的相关知识,感兴趣的朋友一起看看吧
    2023-12-12
  • asp.net GridView中超链接的使用(带参数)

    asp.net GridView中超链接的使用(带参数)

    在GridView中,点击链接列跳转到指定页面的实现代码,需要的朋友可以参考下。
    2010-03-03

最新评论