2011-10-19 14 views
11

Mam problem z użyciem StringLengthAttribute podczas sprawdzania poprawności mojego modelu przy użyciu Entity Framework i ASP.NET MVC3.Jak działa atrybut StringLengthAttribute?

Mój model jest oparty na encji Entity Framework, która ma częściową klasę, która używa atrybutu MetadataType, aby poinformować MVC, jakiego typu użyć podczas wyszukiwania metadanych. Jest to przedstawione w poniższym kodzie:

[MetadataType(typeof(PartMetadata))] 
public partial class Part { } 

class PartMetadata 
{ 
    [DisplayName("Part number")] 
    [Required(ErrorMessage="* Required")] 
    [StringLength(50, MinimumLength = 3, ErrorMessage = "* Part numbers must be between 3 and 50 character in length.")] 
    public string Number { get; set; } 

    [StringLength(255, MinimumLength=3, 
     ErrorMessage="* Part descriptions must be between 3 and 255 characters in length.")] 
    public string Description { get; set; } 

    [DisplayName("Drawing required?")] 
    public bool DrawingRequired { get; set; } 
} 

Problem polega na tym, że pole opisu nie jest poprawnie sprawdzane. Używając poniższego kodu mój model jest sprawdzany jako OK i przekierowywany jest na stronę Indeksu kontrolera, nawet jeśli pole opisu jest puste.

if (ModelState.IsValid) 
{ 
    return RedirectToAction("Index"); 
} 
else 
{ 
    return View(); 
    } 

Jeśli dodać RequiredAttribute na polu opisu wtedy mój model jest klasyfikowany jako w nieprawidłowym stanie, a moja forma jest przeładowane pokazując domyślną wiadomość o błędzie wymaganego atrybutu. Jeśli później edytuję pole opisu, to pojawi się komunikat o sprawdzaniu poprawności, który ustawiłem w atrybucie długości łańcucha.

Czy tak powinien wyglądać atrybut? Nie jest problemem dekorowanie właściwości za pomocą wymaganego atrybutu, ale wydaje się sprzeczne z intuicją, ponieważ pole nie jest wymagane. Chcę tylko upewnić się, że jeśli użytkownik wpisze coś, to mieści się w zakresie atrybutu długości łańcucha.

+1

Jak rozumiem, jest to dokładnie działa, jak można oczekiwać, że. To jest właśnie sprawdzanie długości ciągu ***, jeśli ** użytkownik wpisze coś *. Jeśli * naprawdę * chcesz, żeby on/ona coś wpisał, [Wymagane] jest potrzebny, tak jak powiedziałeś. Jakie zachowanie szukasz? – Joao

+1

Pozbawianie pustego pola jest traktowane jako ** zerowe ** i wtedy wyzwalacze atrybutów [Wymagane] uruchamiają się. – Joao

Odpowiedz

18

Tak, to jest prawidłowe zachowanie. StringLength sprawdza, czy ciąg znaków ma określoną długość, ale nie wymaga wpisania ciągu znaków. Udekoruj Opis za pomocą [Wymagane], aby mieć zarówno wymaganie dla ciągu, a StringLength zapewni ograniczenia na długości łańcucha.

+1

+1 pokonałeś mnie do ponczu. Wygląda jak prosta naprawa. –

+0

Dzięki. To naprawdę ma sens i to był łańcuch zerowy, który mnie rzucił. Sprawdziłem, że to działa. Dziękuję Ci. –

0

Słowo kluczowe [Wymagane] zapewnia kontrolę długości i wartości, gdy połączenie znajduje się w pliku .cshtml. Nie otrzymasz ostrzeżeń wejścia dla pól, które nie są zawarte, ale będziesz, jeśli którykolwiek z pól modelu używających [Wymagane] jest niewidoczny i nie jest prawidłowo wypełniony.

W związku z tym można używać modelu bez wywoływania wszystkich wymaganych pól, a strona internetowa może zbierać grupy wartości pól do modelu za pośrednictwem wielu stron lub wykorzystywać tylko zawarte w nim pola z pliku .cshtml przy użyciu modelu.

słowo następująco:

class PartMetadata 
{ 
    [Required] 
    [DisplayName("Part number")] 
    [Required(ErrorMessage="* Required")] 
    [StringLength(50, MinimumLength = 3, ErrorMessage = "* Part numbers must be between 3 and 50 character in length.")] 
    public string Number { get; set; } 
Powiązane problemy