新闻中心

ASP.NET Core 中的自定义模型验证器如何创建?

2025-11-05
浏览次数:
返回列表
通过继承ValidationAttribute并重写IsValid方法可创建自定义模型验证器,如CustomEmailAttribute用于验证邮箱格式;将特性应用于模型属性即可实现灵活数据校验;支持结合IValidatableObject进行跨字段验证,或在控制器中处理异步验证逻辑,提升API输入的合法性与代码复用性。

asp.net core 中的自定义模型验证器如何创建?

在 ASP.NET Core 中创建自定义模型验证器,主要是通过继承 ValidationAttribute 类并重写其 IsValid 方法来实现。这种方式可以让你对模型属性进行灵活的数据验证,比如检查字符串格式、数值范围或自定义业务规则。

创建自定义验证特性类

首先定义一个类,继承 ValidationAttribute,并重写 IsValid 方法:

public class CustomEmailAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value == null || string.IsNullOrEmpty(value.ToString()))
        {
            return new ValidationResult("邮箱不能为空。");
        }

        var email = value.ToString();
        if (!email.Contains("@") || !email.Contains("."))
        {
            return new ValidationResult("邮箱格式不正确。");
        }

        return ValidationResult.Success;
    }
}

在模型中使用自定义验证器

将自定义特性应用到需要验证的模型属性上:

刺鸟创客 刺鸟创客

一款专业高效稳定的AI内容创作平台

刺鸟创客 110 查看详情 刺鸟创客
public class UserRegistrationModel
{
    [Required(ErrorMessage = "用户名是必填项")]
    public string UserName { get; set; }

    [CustomEmail]
    public string Email { get; set; }

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

支持异步验证(可选进阶)

如果需要执行异步验证(如数据库查重),可以结合 IAsyncEnumerable 或自定义实现 IClientModelValidator 和异步逻辑,但注意默认的 ValidationAttribute 不直接支持异步。更推荐的方式是使用 ActionFilter 或在控制器中手动调用异步检查。

也可以实现 IValidatableObject 接口,在模型内部添加跨字段验证逻辑:

public class UserRegistrationModel : IValidatableObject
{
    public string Email { get; set; }
    public string ConfirmEmail { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (Email != ConfirmEmail)
        {
            yield return new ValidationResult("两次输入的邮箱不一致。", new[] { nameof(ConfirmEmail) });
        }
    }
}
基本上就这些。自定义模型验证器让数据校验更清晰且可复用,配合内置特性一起使用,能有效保障 API 输入的合法性。

以上就是ASP.NET Core 中的自定义模型验证器如何创建?的详细内容,更多请关注其它相关文章!


# 两次  # 荆门信息流推广网站有哪些  # 西安网站建设顾问  # 深圳网站建设维护方法  # 我们学seo可以做什么  # 家装广告画面网站推广  # 甘肃seo助手招商加盟  # 市场推广和营销代表招聘  # 安阳搜狗网站推广优化  # 益阳网站推广全国招商  # seo成本计算  # 中文网  # 相关文章  # ai  # 有哪些  # 器中  # 进阶  # 游戏开发  # 复用  # 重写  # 自定义  # red  # .net  # 代码复用  # 邮箱 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口  windows10怎么关闭系统提示音_windows10彻底静音设置方法  MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略  文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】  Python字典中优雅地迭代剩余元素的方法  微信群消息显示延迟如何解决 微信群消息刷新优化方法  微信网页版登录教程_微信网页版登录入口在哪  age动漫网站入口 age动漫官网直接访问入口  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  Tabulator表格中精确实现日期时间排序的指南  如何在更新Composer依赖后自动运行测试_使用post-update-cmd钩子触发PHPUnit  Python实时数据流中的动态最值查找策略  CSS Box Model与弹性按钮:维持布局稳定的动画实践  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  Pyrogram与g4f集成:异步编程实践与常见错误解决  AO3官方在线访问地址 Archive of Our Own最新镜像合集  理解J*aScript Promise的微任务队列与执行顺序  千牛数据看板网页版_千牛数据看板网页版访问方法  新三国志曹操传110级星符试炼夏侯渊极难攻略  Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议  解决深度学习模型训练初期异常高损失与完美验证准确率问题  在python-socketio事件处理器中安全访问Flask应用上下文  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  期待已久:小米17 Ultra、小米首款NAS本月登场  Mac怎么使用表情符号_Mac Emoji快捷键面板  谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版  css绝对定位元素脱离父容器怎么办_确保父元素position非static  单射、满射与双射的关系 一文理清所有逻辑  如何高效处理PHP中的Excel数据导入导出?PortPHP/Spreadsheet助你轻松搞定!  Python多版本共存与虚拟环境管理深度指南  J*aScript DOM操作:高效清空列表元素的策略与实践  Python多线程中正确使用sigwait处理SIGALRM信号  企业名称高精度匹配:N-gram方法在结构相似性分析中的应用  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  CSS布局中意外空白:解决padding-top导致的顶部间距问题  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension  小米Civi 4录制视频过暗_小米Civi 4亮度优化  浏览器打开即用 美图秀秀网页版入口  纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析  支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡  如何将HTML表格多行数据保存到Google Sheet  Lar*el递归关系中排除子孙节点的策略  Typer应用中灵活处理命令行参数的令牌化与解析  c++项目目录结构应该如何组织_c++工程化项目结构规范  c++中的std::launder有什么实际用途_c++对象生命周期与指针优化  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程  mysql如何设置表访问权限_mysql表访问权限配置  J*aScript中赋值与自增运算符的复杂交互与执行机制  智慧团建扫码登录入口 智慧团建扫码登录入口官网版​ 

搜索