Jaka jest różnica w zachowaniu [MaxLength]
i [StringLength]
atrybutach?
O ile wiem (z wyjątkiem, który [MaxLength]
może zweryfikować maksymalną długość tablicy), są one identyczne i nieco nadmiarowe?
Jaka jest różnica w zachowaniu [MaxLength]
i [StringLength]
atrybutach?
O ile wiem (z wyjątkiem, który [MaxLength]
może zweryfikować maksymalną długość tablicy), są one identyczne i nieco nadmiarowe?
Odpowiedzi:
MaxLength jest używana dla Entity Framework, aby zdecydować, jak duże ma być pole wartości ciągu podczas tworzenia bazy danych.
Z MSDN:
Określa maksymalną długość danych tablicowych lub łańcuchowych dozwolonych we właściwości.
StringLength to adnotacja danych, która będzie używana do sprawdzania poprawności danych wejściowych użytkownika.
Z MSDN:
Określa minimalną i maksymalną długość znaków, które są dozwolone w polu danych.
MaxLengthAttribute
, podczas gdy EF rozpoznajeStringLengthAttribute
[MaxLength]
więc wyświetla się komunikat o błędzie?
Kilka szybkich, ale niezwykle przydatnych dodatkowych informacji, których właśnie nauczyłem się z innego postu, ale nie mogę znaleźć dokumentacji (jeśli ktoś może udostępnić link do niej w witrynie MSDN, to byłoby niesamowite):
Komunikaty walidacyjne skojarzone z tymi atrybutami faktycznie zastąpią symbole zastępcze skojarzone z atrybutami. Na przykład:
[MaxLength(100, "{0} can have a max of {1} characters")]
public string Address { get; set; }
Jeśli przekroczy limit znaków, wyświetli następujący komunikat: „Adres może mieć maksymalnie 100 znaków”
Znane mi symbole zastępcze to:
Poniżej znajdują się wyniki, gdy używamy zarówno [MaxLength]
i [StringLength]
atrybutów, w EF code first
. Jeśli użyjesz obu, [MaxLength]
wygrywa wyścig. Zobacz wynik testu w studentname
kolumnie poniżej klasy
public class Student
{
public Student () {}
[Key]
[Column(Order=1)]
public int StudentKey { get; set; }
//[MaxLength(50),StringLength(60)] //studentname column will be nvarchar(50)
//[StringLength(60)] //studentname column will be nvarchar(60)
[MaxLength(50)] //studentname column will be nvarchar(50)
public string StudentName { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }
}
Wszystkie dobre odpowiedzi ... Z punktu widzenia walidacji zauważyłem również, że MaxLength jest sprawdzana tylko po stronie serwera, podczas gdy StringLength jest sprawdzana również po stronie klienta.
MaxLengthAttribute oznacza Max. dozwolona długość tablicy lub ciągu danych
StringLengthAttribute oznacza min. i max. długość znaków, które są dozwolone w polu danych
Odwiedź http://joeylicc.wordpress.com/2013/06/20/asp-net-mvc-model-validation-using-data-annotations/
Kolejnym punktem do zanotowania jest atrybut MaxLength, który możesz podać tylko maksymalny wymagany zakres, a nie minimalny wymagany zakres. Będąc w StringLength , możesz podać oba .
Rozwiązałem to, dodając poniższą linię w moim kontekście:
modelBuilder.Entity<YourObject>().Property(e => e.YourColumn).HasMaxLength(4000);
Jakoś mi się [MaxLength]
to nie udało.
Podczas używania atrybutu do ograniczenia maksymalnej długości danych wejściowych dla tekstu z formularza na stronie internetowej, StringLength wydaje się generować atrybut html maxlength (przynajmniej w moim teście z MVC 5). Wybór zależy od tego, w jaki sposób chcesz ostrzec użytkownika, że jest to maksymalna długość tekstu. Z atrybutem stringlength, użytkownik po prostu nie będzie mógł wpisać więcej niż dozwolona długość. Atrybut maxlength nie dodaje tego atrybutu html, zamiast tego generuje atrybuty walidacji danych, co oznacza, że użytkownik może pisać poza wskazaną długością, a zapobieganie dłuższemu wprowadzaniu zależy od walidacji w javascript, kiedy przechodzi do następnego pola lub kliknie przycisk Prześlij (lub jeśli javascript jest wyłączone, walidacja po stronie serwera). W takim przypadku użytkownik może zostać powiadomiony o ograniczeniu za pomocą komunikatu o błędzie.