2012-12-31 93 views
5

基本上,如果我有一個對象集合,我如何將驗證屬性應用於集合中的每個項目(例如MaxLengthAttribute)?如何將驗證屬性應用於集合中的對象?

public class Foo 
{ 
    public ICollection<string> Bars { get; set; } 
} 

例如,我怎麼能保證酒吧包含驗證對256的最大長度的字符串?

更新:

我知道如何在一個單一的財產申請驗證屬性,但問題是詢問如何收集內並將其應用在物體

public class Foo 
{ 
    [StringLength(256)] // This is obvious 
    public string Bar { get; set; } 

    // How do you apply the necessary attribute to each object in the collection! 
    public ICollection<string> Bars { get; set; } 
} 
+0

實體框架還是ASP.NET MVC? – abatishchev

+0

@abatishchev:都沒有。只是一般的C#。 –

回答

-1

看看數據註解功能:

這是否對你的工作?

using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
public class Foo 
{ 
    [StringLength(256)] 
    public ICollection<string> Bars { get; set; } 
} 
+0

這不起作用,因爲示例中的StringLengthAttribute應用於集合本身,而不是集合中的單個字符串。 –

1

OK,我發現一個很不錯的文章,解釋這個一些有用的信息:

http://blogs.msdn.com/b/codeanalysis/archive/2006/04/27/faq-why-does-donotexposegenericlists-recommend-that-i-expose-collection-lt-t-gt-instead-of-list-lt-t-gt-david-kean.aspx

下面是一些建議的代碼,這將使foo的酒吧會員做你想要什麼。

public class Foo 
{ 
    public ValidatedStringCollection Bars = new ValidatedStringCollection(10); 
} 

public class ValidatedStringCollection : Collection<string> 
{ 

    int _maxStringLength; 

    public ValidatedStringCollection(int MaxStringLength) 
    { 
     _maxStringLength = MaxStringLength; 
    } 

    protected override void InsertItem(int index, string item) 
    { 
     if (item.Length > _maxStringLength) 
     { 
      throw new ArgumentException(String.Format("Length of string \"{0}\" is beyond the maximum of {1}.", item, _maxStringLength)); 
     } 
     base.InsertItem(index, item); 
    } 

} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Foo x = new Foo(); 
     x.Bars.Add("A"); 
     x.Bars.Add("CCCCCDDDDD"); 
     //x.Bars.Add("This string is longer than 10 and will throw an exception if uncommented."); 

     foreach (string item in x.Bars) 
     { 
      Console.WriteLine(item); 
     } 

     Console.ReadKey(); 
    } 
} 

鏈接的文章有幾個建議,包括覆蓋在收集等方法,有條件執行的事件等,這應該有望覆蓋你。

1

我知道這個問題有點老,但也許有人一起尋找答案。

我不知道的應用屬性藏品一個通用的方法,但是對於特定的字符串長度例如我用下面的:

public class StringEnumerationLengthValidationAttribute : StringLengthAttribute 
{ 
    public StringEnumerationLengthValidationAttribute(int maximumLength) 
     : base(maximumLength) 
    { } 

    public override bool RequiresValidationContext { get { return true; } } 
    public override bool IsValid(object value) 
    { return false; } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     var e1 = value as IEnumerable<string>; 
     if (e1 != null) return IsEnumerationValid(e1, validationContext); 
     return ValidationResult.Success; // what if applied to something else than IEnumerable<string> or it is null? 
    } 

    protected ValidationResult IsEnumerationValid(IEnumerable<string> coll, ValidationContext validationContext) 
    { 
     foreach (var item in coll) 
     { 
      // utilize the actual StringLengthAttribute to validate the items 
      if (!base.IsValid(item) || (MinimumLength > 0 && item == null)) 
      { 
       return new ValidationResult(base.FormatErrorMessage(validationContext.DisplayName)); 
      } 
     } 
     return ValidationResult.Success; 
    } 
} 

應用如下,需要4-10個字符每個收集項目:

[StringEnumerationLengthValidation(10, MinimumLength=4)] 
public ICollection<string> Sample { get; set; } 
相關問題