2011-03-13 8 views
12

Mam klasy modelu, które mają właściwość description z atrybutem adnotacji danych StringLength i długość jest ustawiona na 100 znaków. Gdy ta właściwość ma więcej niż 100 znaków, a Entity Framework próbuje zapisać tę właściwość, pojawia się następujący błąd.C# Jak korzystać z DataAnnotations StringLength i SubString do usuwania tekstu

[StringLength(100, ErrorMessage = "Description Max Length is 100")] 
     public string Description { get; set; } 

Błąd:
„Validation nie powiodło się dla jednego lub większej liczby podmiotów Zobacz właściwość«EntityValidationErrors»więcej szczegółów.”

Nie jestem pewien, czy to pomaga w tworzeniu rozwiązań, ale Korzystam z Entity Framework CTP5 i Code First.

Co chcę zrobić, to jeśli opis ma więcej niż 100 znaków, a następnie usunąć znaki, które mają więcej niż 100 znaków, aby można było zapisać opis i nie zgłaszać błędów.

Wierzę, że powinienem móc użyć atrybutu DataAnnotation StringLength ręcznie, aby pomóc mi zidentyfikować prawidłową długość opisu, a następnie użyć SubString do usunięcia dowolnych znaków powyżej prawidłowej kwoty.

Czy ktoś wie, jak korzystać z DataAnnotation w tej sytuacji? Czy są jeszcze dostępne inne opcje?


Aktualizacja Zrobiłem, co sugeruje BrokenGlass i tu moja realizacja jeżeli:

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

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

     return maxLength; 
    } 
} 


int? maxLength = DataAnnotation.GetMaxLengthFromStringLengthAttribute(typeof(Car), "Description"); 

if(maxLength != null && car.Description.Length > maxLength) 
    car.Description = car.Description.Substring(0, maxLength.Value); 

BarDev

+0

Czy są jakieś inne znaczniki, które powinienem dodać do tego pytania? –

+0

Niewiele wiadomo na temat DataAnnotation. Jeśli chodzi o inne opcje, możesz po prostu zaimplementować metody pobierające/ustawiające i wykonać sprawdzanie/obcięcie w ustawiaczu. – Rob

+0

Dzięki za sugestię. Po prostu zrobiłem to jako pracę dookoła. Prawdopodobnie nadmiernie komplikuję sprawę. Ale widzę różne sytuacje, w których chciałbym mieć walidację i inne sytuacje, w których chciałbym usunąć dodatkowe postacie. W mojej aplikacji WCF chciałbym usunąć dodatkowy znak i nie zgłaszać błędu, ale w aplikacji do wprowadzania danych takich ASP.NET lub Win Forms chciałbym wywołać wiadomość sprawdzania poprawności dla użytkownika. –

Odpowiedz

9

Zawsze możesz sprawdzić wartość atrybutu przy użyciu odbicia, mimo że takie podejście nie jest najlepiej, jeśli możesz go obejść - to nie jest ładne:

var attribute = typeof(ModelClass).GetProperties() 
            .Where(p => p.Name == "Description") 
            .Single() 
            .GetCustomAttributes(typeof(StringLengthAttribute), true) 
            .Single() as StringLengthAttribute; 

Console.WriteLine("Maximum Length: {0}", attribute.MaximumLength);  
+0

Mogę tego użyć. Mogę to enkapsulować i wywołać to z dowolnej części mojego kodu. Zamierzam poczekać trochę dłużej i sprawdzić, czy dostanę dodatkowe odpowiedzi. Dziękuję za odpowiedź. –

2

Tworzenie widoku modelu, który nie ma adnotacji danych na długość, a następnie można mapować go do modelu podmiotu i obcina wartość, jeśli to dłużej niż 100.

+0

Powinienem był wspomnieć, że potrzebuję adnotacji danych do celów odwetowych w mojej aplikacji MVC3, więc nie muszę powtarzać kodu. –

+0

Wszystko zależy od tego, gdzie chcesz egzekwować ograniczenia.Mam tendencję do utrzymywania mojego modelu "danych" w czystości i zmuszania ViewModel do sprawdzania poprawności, więc mój ViewModel ma adnotacje. –

10

Dlaczego wszystko kłopotów? Dlaczego nie

private string _description = string.Empty; 

[StringLength(100, ErrorMessage = "Description Max Length is 100")] 
public string Description 
{ 
    get { return _description; } 
    set { _description = value.Substring(0,100); }; // or something equivalent 
} 
+8

Twój 'zestaw' całkowicie walczy z walidacją, po cichu obcinając. To bezsensowne. Albo sprawdź poprawność, albo skróć. Ale skracanie w milczeniu to okropny, okropny pomysł. – ErikE

Powiązane problemy