You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:34:49