0

0

ASP.NET Core中的模型验证是什么?如何实现?

幻夢星雲

幻夢星雲

发布时间:2025-09-12 08:30:03

|

246人浏览过

|

来源于php中文网

原创

答案:ASP.NET Core模型验证通过数据注解、自定义验证属性、IValidatableObject接口和远程验证实现,结合ModelState.IsValid在控制器中验证数据,并在API中返回BadRequest(ModelState)以提供错误详情,同时支持客户端验证以提升用户体验。

asp.net core中的模型验证是什么?如何实现?

ASP.NET Core中的模型验证,简单来说,就是确保你从客户端(比如浏览器)接收到的数据符合你预期的格式和规则。这对于保证数据的完整性、安全性和应用程序的稳定运行至关重要。实现方式多种多样,但核心都是围绕着数据注解(Data Annotations)和自定义验证展开的。

解决方案:

ASP.NET Core提供了强大的模型验证机制,主要通过以下几个步骤实现:

  1. 数据注解(Data Annotations): 这是最常用的方式。你可以在你的模型类(通常是ViewModel或DTO)的属性上添加各种注解,例如

    [Required]
    [StringLength]
    [Range]
    [EmailAddress]
    等。这些注解定义了属性必须满足的规则。

    public class UserViewModel
    {
        [Required(ErrorMessage = "用户名是必填项")]
        [StringLength(50, MinimumLength = 3, ErrorMessage = "用户名长度必须在3到50个字符之间")]
        public string Username { get; set; }
    
        [Required(ErrorMessage = "密码是必填项")]
        [DataType(DataType.Password)]
        public string Password { get; set; }
    
        [EmailAddress(ErrorMessage = "无效的邮箱地址")]
        public string Email { get; set; }
    
        [Range(18, 120, ErrorMessage = "年龄必须在18到120之间")]
        public int Age { get; set; }
    }
  2. 在Controller中使用

    ModelState.IsValid
    进行验证: 当你的Controller接收到模型数据时,你需要检查
    ModelState.IsValid
    属性。如果该属性为
    false
    ,则表示模型验证失败,你需要将错误信息返回给客户端。

    [HttpPost]
    public IActionResult Create(UserViewModel model)
    {
        if (!ModelState.IsValid)
        {
            // 模型验证失败,将错误信息返回给客户端
            return View(model); // 或者返回BadRequest,根据你的API设计
        }
    
        // 模型验证成功,执行后续操作(例如保存到数据库)
        // ...
    
        return RedirectToAction("Index");
    }
  3. 自定义验证属性: 如果数据注解无法满足你的需求,你可以创建自定义的验证属性。这需要你继承

    ValidationAttribute
    类,并重写
    IsValid
    方法。

    public class CustomValidationAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            if (value == null)
            {
                return new ValidationResult("值不能为空");
            }
    
            string strValue = value.ToString();
            if (strValue.Contains("forbiddenWord"))
            {
                return new ValidationResult("值包含禁用词");
            }
    
            return ValidationResult.Success;
        }
    }
    
    public class MyModel
    {
        [CustomValidation]
        public string MyProperty { get; set; }
    }
  4. IValidatableObject
    接口: 模型类也可以实现
    IValidatableObject
    接口,该接口包含一个
    Validate
    方法,你可以在该方法中执行更复杂的验证逻辑,例如跨属性验证。

    public class Product : IValidatableObject
    {
        public decimal Price { get; set; }
        public decimal Discount { get; set; }
    
        public IEnumerable Validate(ValidationContext validationContext)
        {
            if (Discount > Price)
            {
                yield return new ValidationResult("折扣不能大于价格", new[] { "Discount", "Price" });
            }
        }
    }
  5. 客户端验证: ASP.NET Core 默认支持客户端验证,这意味着验证规则会在客户端(通常是浏览器)执行,从而减少服务器的负载。 客户端验证依赖于jQuery Validate插件。

为什么我的模型验证总是失败?

模型验证失败的原因有很多,最常见的是:

  • 必填字段为空: 使用了
    [Required]
    注解的字段没有提供值。
  • 数据类型不匹配: 例如,你期望一个整数,但客户端发送的是字符串。
  • 超出范围: 使用了
    [Range]
    注解的字段的值超出了指定的范围。
  • 字符串长度不符合要求: 使用了
    [StringLength]
    注解的字段的长度不符合要求。
  • 邮箱地址格式不正确: 使用了
    [EmailAddress]
    注解的字段不是有效的邮箱地址。
  • 自定义验证失败: 你的自定义验证属性返回了错误。
  • 客户端验证未启用或配置错误: 客户端验证依赖于一些javascript库,如果这些库没有正确引入或者配置,客户端验证将不会生效。

为了诊断问题,你可以:

松果AI写作
松果AI写作

专业全能的高效AI写作工具

下载
  • ModelState.IsValid
    false
    时,遍历
    ModelState.Values
    ,查看每个属性的错误信息。
  • 使用浏览器的开发者工具查看客户端发送的数据是否正确。
  • 调试你的自定义验证属性,确保其逻辑正确。

如何在API中使用模型验证?

在API中使用模型验证与在MVC应用程序中使用模型验证类似,但返回结果的方式略有不同。通常,API会返回一个包含错误信息的JSON响应,而不是一个View。

[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    [HttpPost]
    public IActionResult Create([FromBody] UserViewModel model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState); // 返回400 Bad Request,包含错误信息
        }

        // ...
        return CreatedAtAction(nameof(Get), new { id = 1 }, model); // 返回201 Created
    }

    [HttpGet("{id}")]
    public IActionResult Get(int id)
    {
        return Ok(new { Id = id, Name = "Test" });
    }
}

在这个例子中,如果模型验证失败,

BadRequest(ModelState)
会返回一个400 Bad Request响应,响应体包含一个JSON对象,其中包含了所有验证错误信息。客户端可以解析这个JSON对象,并将错误信息显示给用户。
[FromBody]
特性告诉 ASP.NET Core 从请求正文中读取数据并将其绑定到
UserViewModel
模型。

如何禁用客户端验证?

虽然客户端验证可以提高用户体验,但在某些情况下,你可能需要禁用它。例如,你可能需要使用自定义的客户端验证逻辑,或者你可能不希望在客户端暴露验证规则。

你可以通过以下方式禁用客户端验证:

  • _ViewStart.cshtml
    中禁用:
    你可以设置
    ViewData["ValidateAntiForgeryToken"] = false;
    来禁用整个应用程序的客户端验证。
  • 在特定的View中禁用: 你可以在特定的View中设置
    ViewData["ValidateAntiForgeryToken"] = false;
    来禁用该View的客户端验证。
  • 在Controller Action中禁用: 你可以在Controller Action中使用
    [IgnoreAntiforgeryToken]
    特性来禁用该Action的客户端验证。

需要注意的是,禁用客户端验证会增加服务器的负载,因为所有验证都需要在服务器端执行。 另外,

ValidateAntiForgeryToken
用于防止跨站点请求伪造(CSRF)攻击。 禁用它通常是不推荐的,除非你有其他的CSRF保护机制。

如何进行远程验证?

远程验证允许你使用服务器端的代码来验证客户端输入。这对于需要访问数据库或其他外部资源的验证非常有用。例如,你可以使用远程验证来检查用户名是否已存在。

  1. 创建Controller Action: 你需要创建一个Controller Action来执行验证逻辑。该Action应该返回一个JSON对象,其中包含一个布尔值,表示验证是否成功。

    [AcceptVerbs("Get", "Post")]
    public IActionResult VerifyUsername(string username)
    {
        if (_userService.IsUsernameAvailable(username))
        {
            return Json(true); // 用户名可用
        }
        else
        {
            return Json($"用户名 {username} 已经被使用"); // 用户名不可用
        }
    }
  2. 使用

    [Remote]
    注解: 在你的模型类的属性上使用
    [Remote]
    注解,指定用于执行验证的Controller Action。

    public class UserViewModel
    {
        [Remote(action: "VerifyUsername", controller: "Users")]
        [Required(ErrorMessage = "用户名是必填项")]
        public string Username { get; set; }
    }

[Remote]
注解告诉 ASP.NET Core 使用
UsersController
中的
VerifyUsername
Action 来验证
Username
属性。当用户在客户端输入用户名时,客户端会向服务器发送一个AJAX请求,调用
VerifyUsername
Action,并将用户名作为参数传递给它。
VerifyUsername
Action 执行验证逻辑,并返回一个JSON响应,客户端根据响应结果显示验证信息。

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

552

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

374

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

731

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

476

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

990

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

656

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

551

2023.09.20

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.1万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号