新闻中心
ASP.NET Core 中的自定义模型验证器如何创建?
通过继承ValidationAttribute并重写IsValid方法可创建自定义模型验证器,如CustomEmailAttribute用于验证邮箱格式;将特性应用于模型属性即可实现灵活数据校验;支持结合IValidatableObject进行跨字段验证,或在控制器中处理异步验证逻辑,提升API输入的合法性与代码复用性。

在 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("@") || !e
mail.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中赋值与自增运算符的复杂交互与执行机制
智慧团建扫码登录入口 智慧团建扫码登录入口官网版


2025-11-05
浏览次数:次
返回列表
mail.Contains("."))
{
return new ValidationResult("邮箱格式不正确。");
}
return ValidationResult.Success;
}
}