asp.net core webapi中的数据注解与数据验证

news2025/1/8 6:27:51

在这一课中,主要讲解了如何在 Web API 中使用数据注解(Data Annotations)和进行数据验证,以确保请求数据的有效性和完整性。

在 Web API 中,数据验证是确保客户端传递的数据符合业务规则和格式要求的关键步骤。数据注解提供了一种简洁的方式来对模型进行验证,无需编写额外的验证逻辑。

一、什么是数据注解(Data Annotations)?

数据注解是 .NET 提供的一种用于模型属性的元数据标注方式。它通过在模型类的属性上应用特定的特性(Attribute)来定义验证规则。数据注解通常用于验证用户输入、控制数据存储格式、设置显示格式等。

常用的数据注解包括:

  • Required:表示该字段是必填的。
  • StringLength:限制字符串的最大长度或最小长度。
  • Range:指定数值字段的允许范围。
  • EmailAddress:验证电子邮件地址的格式。
  • RegularExpression:验证输入是否匹配特定的正则表达式。
  • Compare:验证两个字段的值是否相等(例如密码确认)。
  • CreditCard:验证信用卡号的格式。
  • Url:验证 URL 的格式。
  • Phone:验证电话号码格式。

二、Web API中的数据验证流程

  1. 定义数据模型:创建一个包含数据注解的模型类,模型类通常用于表示请求体(Request Body)中的数据。

  2. 使用数据注解:在模型类的属性上应用不同的数据注解特性,指定验证规则。

  3. 在控制器中接收数据:在 Web API 控制器中接收这些模型对象作为方法参数。

  4. 验证请求数据:当 Web API 接收到请求时,自动执行数据验证。如果数据无效,API 会返回错误响应,指明哪个字段的值无效。

  5. 自定义验证(可选):除了使用内建的数据注解,还可以实现自定义验证特性或使用 Fluent Validation 等第三方库。

三、使用数据注解进行验证

1. 定义一个数据模型

假设我们要创建一个用户注册的 Web API,其中包含用户的姓名、电子邮件、密码和年龄等字段。我们可以定义一个模型类,并在其中使用数据注解来验证输入数据。

using System.ComponentModel.DataAnnotations;

public class RegisterModel
{
    [Required(ErrorMessage = "姓名是必填项")]
    [StringLength(50, ErrorMessage = "姓名的长度不能超过50个字符")]
    public string Name { get; set; }

    [Required(ErrorMessage = "电子邮件是必填项")]
    [EmailAddress(ErrorMessage = "无效的电子邮件格式")]
    public string Email { get; set; }

    [Required(ErrorMessage = "密码是必填项")]
    [StringLength(100, MinimumLength = 6, ErrorMessage = "密码长度必须在6到100个字符之间")]
    public string Password { get; set; }

    [Range(18, 100, ErrorMessage = "年龄必须在18到100岁之间")]
    public int Age { get; set; }
}

在上面的代码中,RegisterModel 类定义了用户注册所需的数据字段:

  • Name:必填,且最大长度不能超过 50 个字符。
  • Email:必填,并且需要符合电子邮件格式。
  • Password:必填,且长度需要在 6 到 100 个字符之间。
  • Age:必须是 18 到 100 之间的整数。
2. 在控制器中使用模型

接下来,在 Web API 控制器中,使用 RegisterModel 作为请求参数:

using Microsoft.AspNetCore.Mvc;

[Route("api/[controller]")]
[ApiController]
public class UserController : ControllerBase
{
    [HttpPost("register")]
    public IActionResult Register([FromBody] RegisterModel model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);  // 返回验证失败的详细信息
        }

        // 如果数据有效,执行注册逻辑
        return Ok("注册成功");
    }
}

UserControllerRegister 方法中,我们将 RegisterModel 作为请求体参数。如果传递的数据无效,ModelState.IsValid 会返回 false,此时我们使用 BadRequest(ModelState) 返回所有验证失败的详细信息。

3. 返回验证错误信息

如果请求数据无效,API 会返回类似以下的响应,指明哪些字段未通过验证:

{
    "name": ["姓名是必填项"],
    "email": ["无效的电子邮件格式"],
    "password": ["密码长度必须在6到100个字符之间"],
    "age": ["年龄必须在18到100岁之间"]
}

四、常见数据注解的使用示例

1. Required — 必填验证
[Required(ErrorMessage = "用户名是必填项")]
public string Username { get; set; }
2. StringLength — 字符串长度限制
[StringLength(50, MinimumLength = 5, ErrorMessage = "用户名长度必须在5到50个字符之间")]
public string Username { get; set; }
3. EmailAddress — 验证电子邮件格式
[EmailAddress(ErrorMessage = "请输入有效的电子邮件地址")]
public string Email { get; set; }
4. Range — 数值范围限制
[Range(18, 100, ErrorMessage = "年龄必须在18到100岁之间")]
public int Age { get; set; }
5. RegularExpression — 正则表达式验证
[RegularExpression(@"^\d{3}-\d{2}-\d{4}$", ErrorMessage = "无效的社会安全号格式")]
public string SSN { get; set; }

五、使用 Fluent Validation 进行复杂验证

除了数据注解,Fluent Validation 是一个流行的第三方库,它提供了更灵活的验证功能。使用 Fluent Validation,你可以通过更具可读性的语法进行复杂的验证。

using FluentValidation;

public class RegisterModelValidator : AbstractValidator<RegisterModel>
{
    public RegisterModelValidator()
    {
        RuleFor(x => x.Name).NotEmpty().WithMessage("姓名不能为空").Length(1, 50);
        RuleFor(x => x.Email).NotEmpty().EmailAddress().WithMessage("无效的电子邮件");
        RuleFor(x => x.Password).NotEmpty().Length(6, 100).WithMessage("密码长度必须在6到100个字符之间");
        RuleFor(x => x.Age).InclusiveBetween(18, 100).WithMessage("年龄必须在18到100岁之间");
    }
}

Fluent Validation 提供了更加灵活和可配置的验证机制,适用于复杂的验证场景。

六、总结

在 Web API 中使用数据注解和数据验证是一种简单而有效的方式,用于确保客户端传递的请求数据符合要求。通过数据注解,我们能够轻松定义字段的验证规则,如必填、长度、范围、格式等。在实际开发中,结合数据注解和合适的错误处理,可以提高 API 的健壮性,确保应用的正确性和安全性。

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

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

相关文章

加速科技荣获“浙江省企业研究院”认定

近日&#xff0c;浙江省经济和信息化厅公布“2024年认定&#xff08;备案&#xff09;省级企业研发机构名单”。经过多轮严格评审和公示&#xff0c;加速科技荣获“省企业研究院”认定。这是加速科技继获国家级专精特新“小巨人”企业认定荣誉后的又一里程碑。 “浙江省企业研究…

RAG实战:本地部署ragflow+ollama(linux)

1.部署ragflow 1.1安装配置docker 因为ragflow需要诸如elasticsearch、mysql、redis等一系列三方依赖&#xff0c;所以用docker是最简便的方法。 docker安装可参考Linux安装Docker完整教程&#xff0c;安装后修改docker配置如下&#xff1a; vim /etc/docker/daemon.json {…

运动相机拍摄的视频打不开怎么办

3-10 GoPro和大疆DJI运动相机的特点&#xff0c;小巧、高清、续航长、拍摄稳定&#xff0c;很多人会在一些重要场合用来拍摄视频&#xff0c;比如可以用来拿在手里拍摄快速运动中的人等等。 但是毕竟是电子产品&#xff0c;有时候是会出点问题的&#xff0c;比如意外断电、摔重…

【深度学习】深度(Deep Learning)学习基础

深度学习&#xff08;Deep Learning&#xff09; 深度学习是一种基于人工神经网络的机器学习方法&#xff0c;通过多个层次&#xff08;深度&#xff09;的神经网络从数据中自动学习特征和模式。它是人工智能的一个核心领域&#xff0c;尤其在处理复杂数据&#xff08;如图像、…

资源分享:gpts、kaggle、paperswithcode

gpts 似乎是gpt agent集合&#xff0c;专注于不同细分方向的ai助手。 kaggle 专注于AI相关的培训、竞赛、数据集、大模型。 paperswithcode 简单直接&#xff0c;内容如同网站地址&#xff0c;直接提供优秀代码和配套的论文&#xff0c;似乎还有数据集。

vue3 数字滚动效果

效果图 代码 <template><div class"number-scroller"><divclass"viewport":style"{ width: width px, height: height px }"><div class"number-scroller-box" ref"num"><div v-for"num…

《软件测试技术》习题参考答案 -2

目录 第6章 黑盒测试 一、选择题 1、黑盒法是根据程序的&#xff08; C &#xff09;来设计测试用例的。 2、黑盒测试用例设计方法包括&#xff08;B &#xff09;等 )。 3、( A )是一种黑盒测试方法&#xff0c;它是把程序的输入域划分成若干部分&#xff0c;然后从每个部…

十年后LabVIEW编程知识是否会过时?

在考虑LabVIEW编程知识在未来十年内的有效性时&#xff0c;我们可以从几个角度进行分析&#xff1a; ​ 1. 技术发展与软件更新 随着技术的快速发展&#xff0c;许多编程工具和平台不断更新和改进&#xff0c;LabVIEW也不例外。十年后&#xff0c;可能会有新的编程语言或平台…

数据库课设——网上花店销售管理系统(上)

声明&#xff1a;此次课设为本人专业课课设报告内容&#xff0c;仅供参考&#xff0c;不要照搬 1 问题的提出 随着互联网发展与电子商务普及&#xff0c;网上花店兴起&#xff0c;其突破地域限制、提供便捷购物体验且市场呈快速增长趋势。该系统需具备多方面功能以满足花店运营…

外驱功率管电流型PWM控制芯片CRE6281B1

CRE6281B1 是一款外驱功率管的高度集成的电流型PWM 控制 IC&#xff0c;为高性能、低待机功率、低成本、高效率的隔离型反激式开关电源控制器。在满载时&#xff0c;CRE6281B1工作在固定频率(65kHz)模式。在负载较低时&#xff0c;CRE6281B1采用节能模式&#xff0c;实现较高的…

mapbox基础,加载高德栅格底图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.1 ☘️mapboxgl.Map style属性二、🍀加载高德栅格底图1. ☘️实现思路2. ☘…

【大数据】(选修)实验4 安装熟悉HBase数据库并实践

实验4 安装熟悉HBase数据库并实践 1、实验目的 (1)理解HBase在Hadoop体系结构中的角色; (2)熟练使用HBase操作常用的Shell命令; (3)熟悉HBase操作常用的Java API。 2、实验平台 操作系统:Linux Hadoop版本:2.6.0或以上版本 HBase版本:1.1.2或以上版本 JDK版…

安装vue脚手架出现的一系列问题

安装vue脚手架出现的一系列问题 前言使用 npm 安装 vue/cli2.权限问题及解决方法一&#xff1a;可以使用管理员权限进行安装。方法二&#xff1a;更改npm全局安装路径 前言 由于已有较长时间未进行 vue 项目开发&#xff0c;今日着手准备开发一个新的 vue 项目时&#xff0c;在…

前端JS中var、let、const之间的区别

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、var 二、let 三、const 四、区别 变量…

STM32+ADC+DMA快速循环转换

测试平台&#xff1a;STM32F405RGT6 uint32_t AD_Buf[100]{0}; HAL_ADC_Start_DMA(&hadc2,(uint32_t *)AD_Buf,100); while(1) {printf("AD_Buf:%d\n",AD_Buf[0]); }

Unity中 Xlua使用整理(一)

1.安装: 从GitHub上下载Xlua源码 Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc. (github.com) 下载Xlua压缩包&#xff0c;并解压将Aseet文件夹中的Xlua和Plugins文件夹复制到Unit…

js高阶-函数闭包this

闭包 一等公民 在js中函数是一等公民 函数使用很灵活,可以作为参数,也可以作为返回值 高阶函数 函数接收函数作为参数或者返回函数,则该函数称为高阶函数 eg: array.filter/reduce/find/findIndex/map.forEach 函数与方法 独立使用的 Function 做为对象的属性 method Wh…

Ubuntu 24.04.1 LTS nginx配置maccms

之前在Ubuntu 20.04中搭建过&#xff0c;现在换了新操作系统&#xff0c;顺便整理一下。 相关文章 《Ubuntu 20.04.1 LTS搭建nginx php7.4运行环境》 https://blog.csdn.net/lxyoucan/article/details/144850572《linux nginx maccms管理后台无法进入页面不存在和验证码不显…

【Ubuntu】想知道怎么通过命令行查看笔记本电池健康程度吗?

你想在 Ubuntu 中通过命令行检查电池健康状态&#xff0c;而不需要额外安装任何工具吗&#xff1f; 其实&#xff0c;你可以做到。 大多数在笔记本电脑上使用 Ubuntu 的用户都会通过顶部栏来监控电池电量&#xff08;我总是在顶部栏启用电池百分比显示&#xff0c;以便一目了…

ue5动画重定向,一键重定向。ue4小白人替换成ue5

这就是我们下载的 初学者动画内容包 点击设置选中列 绿色的是动画 黄色的关卡 蓝色是蓝图 ctrla 全选 ctrl鼠标左键 选中所有动画 重定向动画资产 不要选错&#xff0c;只要绿色 选择目标网格体 选择所有的绿色 动画 导出动画 添加前缀ycn 导出 一定要提前新建好存放的…