2015-04-23 6 views
5

Nach dem Aktualisieren des Vorschlags erhält ich bin immer noch den FehlerWie die StringLength von DataAnnotations

versucht, beide mit .SingleOrDefault() oder FirstOrDefault()

enter image description here

Ich brauche zum Abrufen des StringLength Annotation Wertes bekommen und hier ist mein Code, aber ich bekomme den folgenden Fehler.

Ich habe versucht, so ziemlich den gleichen Code aus here aber immer um den Fehler zu implementieren:

Sequence contains no elements

public static class DataAnnotation 
    { 
     public static int GetMaxLengthFromStringLengthAttribute(Type modelClass, string propertyName) 
     { 
      int maxLength = 0; 
      var attribute = modelClass.GetProperties() 
          .Where(p => p.Name == propertyName) 
          .Single() 
          .GetCustomAttributes(typeof(StringLengthAttribute), true) 
          .Single() as StringLengthAttribute; 

      if (attribute != null) 
       maxLength = attribute.MaximumLength; 

      return 0; 
     } 
    } 

// Berufung:

int length = DataAnnotation.GetMaxLengthFromStringLengthAttribute(typeof(EmployeeViewModel), "Name"); 


public class EmployeeViewModel 
{   
    [StringLength(20, ErrorMessage = "Name cannot be longer than 20 characters.")] 
    public string Name{ get; set; } 
} 

Antwort

4

ich in der Lage heraus zu, getestet und seine Arbeiten groß, für den Fall, wenn jemand anderes sucht!

StringLengthAttribute strLenAttr = typeof(EmployeeViewModel).GetProperty(name).GetCustomAttributes(typeof(StringLengthAttribute), false).Cast<StringLengthAttribute>().SingleOrDefault(); 
    if (strLenAttr != null) 
    { 
    int maxLen = strLenAttr.MaximumLength; 
    } 
1

Sie können aus When you get theLINQ Error “Sequence contains no elements”, this is usually because you are using the First() or Single() command rather than FirstOrDefault() and SingleOrDefault() die Antwort zu bekommen.

Sie müssen also mit SingleOrDefault() statt Single() wie

var attribute = modelClass.GetProperties() 
          .Where(p => p.Name == propertyName) 
          .SingleOrDefault() 
          .GetCustomAttributes(typeof(StringLengthAttribute), true) 
          .SingleOrDefault() as StringLengthAttribute; 
+0

Wenn Sie 'MinimumLength = 1' haben, dann müssen Sie die Mindestlänge erzwingen? obwohl diese Felder optional sind? –

+0

@AbuHamzah: - Meine Antwort aktualisiert. Bitte prüfe! –

+0

Ich aktualisierte meine Frage, immer noch den gleichen Fehler –

0

versuchen Versuchen Sie, Länge als Teil der Fehlermeldung zu zeigen? Wenn so glaube ich, einfach setzen kann ...

public class EmployeeViewModel 
{   
    [StringLength(20, ErrorMessage = "{0} cannot be longer than {1} characters.")] 
    public string Name{ get; set; } 
} 
+0

nein, ich verwende die Länge für andere Validierung Zweck, aber nicht für die Show Länge Fehlermeldung –

0
var maxLength = typeof(EmployeeViewModel) 
        .GetProperty("Name") 
        .GetCustomAttributes<StringLengthAttribute>() 
        .FirstOrDefault() 
        .MaximumLength; 
0

Während ich dies nur die Bekämpfung wurde, dachte ich, dass ich den LinqPad Code liefern würde ich mit um mich zu spielen. Es ist vollständig genug, um in Linqpad zu laufen, fügen Sie einfach die Importe hinzu, wenn Sie erforschen möchten.

Beachten Sie, wo ich das Bit kommentiere, das Sie tatsächlich benötigen. Ich fand es manchmal schwierig, den Code ohne Kontext anzupassen.

///The rest of the code given as context as I'm working on a T4 template to create Model classes from Datalayer classes, so the iteration is required in my case 
void Main() 
{ 
    CVH p = new CVH(); 
    Type t = p.GetType(); 

    foreach (PropertyInfo prop in t.GetProperties()) //Iterating through properties 
    { 
     foreach (var facet in prop.GetCustomAttributes()) //Yank out attributes 
     { 
     //The bit you need 
      if ((Type)facet.TypeId == typeof(StringLengthAttribute)) //What type of attribute is this? 
      { 
       StringLengthAttribute _len = (StringLengthAttribute)facet; //Cast it to grab Maximum/MinimumLengths etc. 
       Console.WriteLine($"My maximum field length is { _len.MaximumLength}"); 
       //End of the bit you need 
       Console.WriteLine(_len.MinimumLength);    
      } 
     } 
    } 
} 
///Test class with some attributes 
public class CVH 
{ 
    [StringLength(50)] 
    [DataType(DataType.PhoneNumber)] 
    public string phone_1 { get; set; } 
    [Required(ErrorMessage = "id is required")] 
    public int id { get; set; } 
    [Required(ErrorMessage = "id is required")] 
    public int contact_id { get; set; } 
}