如何在ValidationAttribute的IsValid方法中不依赖ViewModel获取路由值?
在自定义验证属性中获取路由值(无需在ViewModel添加Id属性)
可以通过请求上下文直接获取路由值,不需要在TestVM中额外定义Id属性,具体实现如下:
1. 先注册HttpContext访问服务
在项目的配置文件(比如Program.cs)中注册IHttpContextAccessor,这是获取当前请求上下文的前提:
builder.Services.AddHttpContextAccessor();
2. 修改自定义验证属性代码
在IsValid方法中,通过ValidationContext获取IHttpContextAccessor实例,进而从请求的路由数据里提取id值:
public class TestVM { [CustomValidation] public string name { get; set; } } public class CustomValidation : ValidationAttribute { protected override ValidationResult? IsValid(object? value, ValidationContext validationContext) { // 获取HttpContext访问器 var httpContextAccessor = validationContext.GetService(typeof(IHttpContextAccessor)) as IHttpContextAccessor; var httpContext = httpContextAccessor?.HttpContext; if (httpContext != null) { // 从路由数据中提取id参数 if (httpContext.Request.RouteValues.TryGetValue("id", out var routeId)) { string? id = routeId?.ToString(); // 这里可以使用id进行自定义验证逻辑 if (string.IsNullOrWhiteSpace(id)) { return new ValidationResult("路由参数Id不能为空"); } } } // 原有Name属性的验证逻辑 if (string.IsNullOrWhiteSpace(value?.ToString())) { return new ValidationResult("Name不能为空"); } return ValidationResult.Success; } }
注意事项
- 确保路由参数的名称是
id,如果你的路由参数命名不同,需要对应修改TryGetValue中的键名。 IHttpContextAccessor必须提前注册,否则无法获取到当前请求的上下文。
内容的提问来源于stack exchange,提问作者gmail user
相关产品推荐
相关产品推荐

