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

时间:2012-12-06 16:24:13

标签: asp.net-mvc validation lambda data-annotations

在这种情况下,是否可以使用强类型方式(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
        }
    }

}

如果在字符串中指定字段名称,则无法重构,例如。

2 个答案:

答案 0 :(得分:4)

我不知道任何“内置”方式。但您可以使用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 });

这样你就没有硬编码的字符串了,重构就行了。

答案 1 :(得分:1)

阅读关于此问题的答案here

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

您可以这样使用它:

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