2017-02-03 100 views
0

我正在编码实体框架模型,我想根据预定义的允许值列表验证给定属性的传入数据。根据之前的研究,我决定通过自定义数据注释属性来确保最好的方法是确保每个需要此验证的属性都有一个传递给此属性的值的伴随数组,名为“[AllowableValue]”自定义属性是要求对象引用,而不是数组

所以我有下面的类:

public class className 
{ 
    public int Id { get; set; } 

    [Required] 
    [AllowableValues(ListOfAllowableValues)] 
    [MaxLength(2), MinLength(2)] 
    public string propertyName { get; set; } 

    [NotMapped] 
    public string[] ListOfAllowableValues = new string[] 
    { 
     "00", 
     "77", 
     "ZZ" 
    }; 

} 

而下面的自定义属性:

public class AllowableValues : ValidationAttribute 
{ 
    string[] _list; 

    public AllowableValues(string[] list) 
    { 
     _list = list; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (_list.Contains((string)value)) 
      return ValidationResult.Success; 
     return new ValidationResult("Invalid value."); 
    } 
} 

但是,在Visual Studio中,当我申请的[AllowableValues]属性,它给我的错误:“一个对象引用是重新为非静态字段,方法或属性'className.ListOfAllowableValues'提供了必要条件。

我的定义要求有一个数组,我传递一个数组。为什么要求一个对象引用?

+0

这比第一个答案有点多。你能否把这个评论下移到答案部分,以便我能接受它? –

+0

移动它,但很抱歉,它不能真正解决您的问题。 –

回答

1

属性声明必须是编译时间常数

因此,您处于静态环境并且没有实例classname。但是ListOfAllowableValues不是static,而是一个实例成员,所以如果没有classname实例(这就是错误所指的“对象引用”),就无法访​​问它。

不幸的是我想让ListOfAllowableValuesstatic不起作用,因为属性的参数必须是编译时间常量,引用类型值不能是编译时间常量。

+0

谢谢。这个答案确实给了我一个更好的想法**为什么**这是不可能的,所以我接受了这个。非常感谢你。 –

1

这是不可能的。 看到这里的SO

Can I initialize a C# attribute with an array or other variable number of arguments?

如何: MSDN CustomAttributes

你唯一的办法就是做到以下几点:

[Required] 
[AllowableValues(new[]{ "00", "77", "ZZ"})] 
[MaxLength(2), MinLength(2)] 
public string propertyName { get; set; } 
+0

有用的信息。但是对此的要求意味着,允许值的列表在应用于其他属性时可以获得非常大的**。我希望能够传递一个数组,使其更具可读性。它看起来像我将不得不通过控制器代码来做到这一点。谢谢你。 –

相关问题