2012-12-31 34 views
5

Về cơ bản, nếu tôi có một bộ sưu tập các đối tượng, làm cách nào tôi có thể áp dụng thuộc tính xác thực cho mỗi mục trong bộ sưu tập (chẳng hạn như MaxLengthAttribute)?Làm cách nào để áp dụng các thuộc tính xác thực cho các đối tượng trong bộ sưu tập?

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

Thí dụ, làm sao tôi có thể đảm bảo rằng Bars chứa chuỗi xác nhận đối với một chiều dài tối đa của 256?

Cập nhật:

Tôi hiểu làm thế nào để áp dụng một thuộc tính xác nhận trên một tài sản duy nhất, nhưng câu hỏi được hỏi làm thế nào để áp dụng nó trên các đối tượng trong một bộ sưu tập.

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

Khuôn khổ thực thể hoặc ASP.NET MVC? – abatishchev

+0

@abatishchev: Không. Chỉ cần chung C#. –

Trả lời

-1

Hãy nhìn vào các chức năng dữ liệu chú thích:

Điều này làm việc cho bạn?

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

Điều này không hoạt động vì StringLengthAttribute trong ví dụ của bạn được áp dụng trên chính bộ sưu tập chứ không phải các chuỗi riêng lẻ trong bộ sưu tập. –

1

OK Tôi tìm thấy một bài viết khá đẹp giải thích một số thông tin hữu ích về vấn đề này:

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

Dưới đây là một số mã mà sẽ làm cho Bars viên của Foo làm những gì bạn muốn đề nghị.

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(); 
    } 
} 

Bài viết được liên kết có một số đề xuất bao gồm ghi đè các phương pháp khác về thu thập, triển khai các sự kiện có điều kiện, v.v. Điều này hy vọng sẽ bao gồm bạn.

1

Tôi biết câu hỏi này khá cũ, nhưng có thể ai đó đến cùng tìm kiếm câu trả lời.

Tôi không nhận thức được một cách tổng quát để áp dụng thuộc tính đến các mục bộ sưu tập, nhưng đối với ví dụ chiều dài chuỗi cụ thể tôi đã sử dụng như sau:

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; 
    } 
} 

Áp dụng như sau, để đòi hỏi 4-10 ký tự cho mỗi mục bộ sưu tập:

[StringEnumerationLengthValidation(10, MinimumLength=4)] 
public ICollection<string> Sample { get; set; } 
Các vấn đề liên quan