StringLength vs MaxLength atrybuty ASP.NET MVC z Entity Framework EF Code First

152

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?

Nick Goloborodko
źródło
1
Nie jestem pewien co do ASP.NET MVC, ale w przypadku EF nie powinno być różnicy: stackoverflow.com/questions/5414611/…
Ladislav Mrnka
1
StringLength nie wpływa na rozmiar migracji migracji po jej zmianie.
Cas Bloem
@CasBloem StringLength w rzeczywistości jest odbierany przez EntityFramework i wpłynie na długość kolumn - przynajmniej w wersji 6.
jakejgordon

Odpowiedzi:

203

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.

Swaff
źródło
10
Zauważ również, że domyślnie MVC 3 nie jest rozpoznawany MaxLengthAttribute, podczas gdy EF rozpoznajeStringLengthAttribute
marcind
15
Więc naprawdę nie ma potrzeby MaxLength, ponieważ możesz użyć StringLength w EF, a także wnioskuje o rozmiar pola ciągu. Dlaczego w takim razie stworzyli MaxLength?
Matt Johnson-Pint
4
@MattJohnson - Przypominam sobie, że decyzja o utworzeniu nowego atrybutu MaxLength była podyktowana semantyką, ponieważ StringLength implikuje dane tekstowe, ale MaxLength może mieć również zastosowanie do danych binarnych. Ale to na pewno jest niewygodne.
Josh
1
@MartinSmith - Właśnie spróbowałem użyć StringLength i zadziałało dla mnie i używam EF6 RC1, więc nie sądzę, że komentarze są poprawne
Colin
5
Dlaczego [MaxLength]więc wyświetla się komunikat o błędzie?
Zapnologica
46

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:

  • {0} = nazwa usługi
  • {1} = maksymalna długość
  • {2} = minimalna długość

Wielkie dzięki dla Bloudraak za wstępne wskazanie tego.

DamienMann
źródło
12

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 studentnamekolumnie 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; }
 }
użytkownik Gmaila
źródło
7

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.

Abhishek Deo
źródło
3

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 .

Nilesh Moradiya
źródło
4
Tak, ale prawdopodobnie dlatego istnieje również atrybut MinLength: msdn.microsoft.com/EN-US/library/gg696756(v=VS.110,d=hv.2).aspx
Ian Griffiths,
1

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.

Zerotoinfinity
źródło
0

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.

Koen
źródło