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

在OnActionExecuting中使用ValidationAttribute获取Action方法参数名的技术疑问

解决方法:从ActionArguments获取参数名

你猜的没错!ActionArguments这个字典里的x.Key正是你要找的参数名——它的键就是Action方法定义时的参数名称,值才是对应的参数实例。

为什么当前代码只拿到参数值?

你现在的代码context.ActionArguments.SingleOrDefault(x => x.Value.ToString().Contains("DTO")).Value,最后取的是Value属性,自然只能拿到参数的实例/值。而ActionArguments本质是一个IDictionary<string, object>,其中:

  • Key:对应Action方法里定义的参数名称(比如你的例子里就是company)
  • Value:对应参数的实际传入值(也就是CompanyForCreationDTO的实例)

修改后的代码示例

如果你想筛选出值是DTO类型的参数,同时拿到它的名称和值,可以这么写:

// 找到符合条件的键值对(用类型判断比ToString更可靠)
var paramEntry = context.ActionArguments.FirstOrDefault(x => 
    x.Value?.GetType().Name.Contains("DTO") == true);

// 检查是否找到匹配项
if (!string.IsNullOrEmpty(paramEntry.Key))
{
    string paramName = paramEntry.Key; // 这里就是参数名,比如"company"
    object paramValue = paramEntry.Value; // 这里是参数值,CompanyForCreationDTO实例
    // 后续逻辑...
}

更健壮的筛选方式

用ToString().Contains("DTO")可能存在风险(比如DTO类重写了ToString方法,或者类型名里没带DTO但确实是你的数据传输对象),如果你的DTO都实现了某个共同接口(比如IDto),或者都继承自同一个基类,可以改成更精准的类型检查:

var paramEntry = context.ActionArguments.FirstOrDefault(x => 
    x.Value is IDto); // 或者 x.Value?.GetType().IsAssignableTo(typeof(BaseDto)) == true

针对你给出的CreateCompany方法,这个筛选逻辑会精准匹配到参数company,拿到它的名称"company"和对应的CompanyForCreationDTO实例。


内容的提问来源于stack exchange,提问作者jimbo jimbo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:07:33