是否可以在 IValidatableObject 方法中以强类型的方式指定字段名称?

Posted

技术标签:

【中文标题】是否可以在 IValidatableObject 方法中以强类型的方式指定字段名称?【英文标题】:Is it possible to specify field names in strongly-typed way in IValidatableObject methods? 【发布时间】:2012-11-24 17:45:52 【问题描述】:

在这种情况下是否可以使用某种强类型方式(lambda?)指定字段名称:

public class Demo : IValidatableObject

    public string DemoField get; set;

    IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
    
        if (<...>)
        
            yield return new ValidationResult("Some validation message", new string[]  "DemoField" ); // <-- Here
        
    


例如,当在字符串中指定字段名称时,它不能被重构。

【问题讨论】:

【参考方案1】:

我不知道任何“内置”方式。但是你可以使用 LINQ 表达式来做这样的事情:

Expression<Func<Demo, string>> lambda = (Demo d) => d.DemoField;
string demoFieldName = ((System.Linq.Expressions.MemberExpression)lambda.Body).Member.Name;
yield return new ValidationResult("Some validation message", new string[]  demoFieldName );

这样你就没有硬编码的字符串,并且重构会起作用。

【讨论】:

【参考方案2】:

阅读我对这个问题的回答here:

https://***.com/a/15396656/643761

你会这样使用它:

yield return new ValidationResult("Some Error.", GetFieldNames(() => new object[]  this.DemoField ));

【讨论】:

以上是关于是否可以在 IValidatableObject 方法中以强类型的方式指定字段名称?的主要内容,如果未能解决你的问题,请参考以下文章

使用 IValidatableObject 检查是不是设置了至少一个参数

如何在 IValidatableObject.Validate 方法的 ValidationContext 参数中提供 IServiceProvider

在 IValidatableObject 上设置 ValidationContext 的 Items 集合?

如果在子级上验证失败,则不会在父级上调用IValidatableObject.Validate

EF 代码优先:IValidatable 对象未验证

如何在 ASP.NET Core 中实现自定义模型验证?