2012-12-31 5 views
5

Grundsätzlich, wenn ich eine Sammlung von Objekten habe, wie kann ich ein Validierungsattribut auf jedes Element in der Sammlung (wie MaxLengthAttribute) anwenden?Wie wenden Sie Validierungsattribute auf Objekte in Sammlungen an?

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

Zum Beispiel, wie kann ich sicherstellen, dass Bars Strings enthalten, die gegen eine maximale Länge von 256 validieren?

Update:

Ich verstehe, wie eine Validierung Attribut auf einer einzigen Eigenschaft anzuwenden, aber die Frage ist zu fragen, wie es innerhalb einer Sammlung von Objekten anzuwenden.

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

Entity Framework oder ASP.NET MVC? – abatishchev

+0

@abatiishchev: Weder. Einfach allgemein C#. –

Antwort

-1

Werfen Sie einen Blick auf die Daten Anmerkung Funktionalität:

macht diese Arbeit für Sie?

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

Dies funktioniert nicht, da das StringLengthAttribute in Ihrem Beispiel auf die Auflistung selbst angewendet wird und nicht auf die einzelnen Zeichenfolgen innerhalb der Auflistung. –

1

OK fand ich einen ziemlich netten Artikel einige nützliche Informationen zu dieser Erklärung:

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

Hier ist ein Code vorgeschlagen, dass die Bars Mitglied von Foo machen würde tun, was Sie wollen.

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

Der verlinkte Artikel hat mehrere Vorschläge, einschließlich auf die Sammlung, die anderen Methoden überschreiben, Ereignisse bedingt Umsetzung, etc. Dies hoffentlich Sie decken sollte.

1

Ich weiß, diese Frage ist irgendwie alt, aber vielleicht kommt jemand auf der Suche nach Antworten.

Ich bin mir nicht bewusst, eine generische Art und Weise Attribute Sammlung Elemente anzuwenden, aber für die spezifische Stringlänge Beispiel verwendete ich folgendes:

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

Nehmen wie folgt zu verlangen, 4-10 Zeichen für Jede Kollektion Artikel:

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