StringLength vs MaxLength menghubungkan ASP.NET MVC dengan Entity Framework EF Code First

152

Apa perbedaan perilaku [MaxLength]dan [StringLength]atribut?

Sejauh yang saya tahu (dengan pengecualian yang [MaxLength]dapat memvalidasi panjang maksimum array) ini identik dan agak berlebihan?

Nick Goloborodko
sumber
1
Saya tidak yakin tentang ASP.NET MVC tetapi untuk EF seharusnya tidak ada perbedaan: stackoverflow.com/questions/5414611/…
Ladislav Mrnka
1
StringLength tidak memengaruhi ukuran col migrasi saat Anda mengubahnya.
Cas Bloem
@CasBloem StringLength sebenarnya dijemput oleh EntityFramework dan akan memengaruhi panjang kolom - setidaknya dalam versi 6.
jakejgordon

Jawaban:

203

MaxLength digunakan untuk Kerangka Entitas untuk memutuskan seberapa besar untuk membuat bidang nilai string saat membuat database.

Dari MSDN:

Menentukan panjang maksimum data array atau string yang diizinkan di properti.

StringLength adalah anotasi data yang akan digunakan untuk validasi input pengguna.

Dari MSDN:

Menentukan panjang minimum dan maksimum karakter yang diizinkan dalam bidang data.

Swaff
sumber
10
Perhatikan juga bahwa secara default MVC 3 tidak dikenali MaxLengthAttribute, sementara EF mengakuiStringLengthAttribute
marcind
15
Jadi benar-benar tidak perlu untuk MaxLength karena Anda dapat menggunakan StringLength di EF dan juga menyimpulkan ukuran bidang string. Lalu mengapa mereka bahkan membuat MaxLength?
Matt Johnson-Pint
4
@MattJohnson - Saya sepertinya ingat bahwa keputusan untuk membuat atribut MaxLength baru adalah untuk semantik karena StringLength mengimplikasikan data string tetapi MaxLength dapat berlaku untuk data biner juga. Tetapi tentu sangat merepotkan.
Josh
1
@ MartinSmith - Saya baru saja mencoba menggunakan StringLength dan itu berhasil untuk saya dan saya menggunakan EF6 RC1 jadi saya tidak berpikir komentar di sana benar
Colin
5
Mengapa [MaxLength]memiliki ErrorMessage?
Zapnologica
46

Beberapa informasi tambahan yang cepat namun sangat berguna yang baru saya pelajari dari pos lain, tetapi sepertinya tidak dapat menemukan dokumentasi untuk (jika ada yang dapat membagikan tautannya di MSDN itu akan luar biasa):

Pesan validasi yang terkait dengan atribut ini sebenarnya akan menggantikan placeholder yang dikaitkan dengan atribut. Sebagai contoh:

[MaxLength(100, "{0} can have a max of {1} characters")]
public string Address { get; set; }

Akan menampilkan yang berikut jika melebihi batas karakter: "Alamat dapat memiliki maksimal 100 karakter"

Placeholder yang saya tahu adalah:

  • {0} = Nama Properti
  • {1} = Panjang Maks
  • {2} = Panjang Min

Terima kasih banyak kepada bloudraak karena pada awalnya menunjukkan ini.

DamienMann
sumber
12

Berikut ini adalah hasil ketika kami menggunakan keduanya [MaxLength]dan [StringLength]atribut, di EF code first. Jika keduanya digunakan, [MaxLength]menangkan balapan. Lihat hasil tes di studentnamekolom di bawah kelas

 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; }
 }
pengguna gmail
sumber
7

Semua jawaban yang baik ... Dari perspektif validasi, saya juga memperhatikan bahwa MaxLength akan divalidasi hanya di sisi server, sementara StringLength juga akan divalidasi di sisi klien.

Abhishek Deo
sumber
3

Satu hal lagi yang perlu diperhatikan adalah dalam atribut MaxLength Anda hanya dapat memberikan rentang yang diperlukan max, bukan rentang minimum yang diperlukan. Sementara di StringLength Anda bisa menyediakan keduanya .

Nilesh Moradiya
sumber
4
Ya, tapi ini mungkin mengapa ada juga atribut MinLength: msdn.microsoft.com/EN-US/library/gg696756(v=VS.110,d=hv.2).aspx
Ian Griffiths
1

Saya telah mengatasinya dengan menambahkan baris di bawah ini dalam konteks saya:

modelBuilder.Entity<YourObject>().Property(e => e.YourColumn).HasMaxLength(4000);

Entah bagaimana, [MaxLength]tidak berhasil untuk saya.

Zerotoinfinity
sumber
0

Saat menggunakan atribut untuk membatasi panjang input maksimum untuk teks dari formulir pada halaman web, StringLength tampaknya menghasilkan atribut html maxlength (setidaknya dalam pengujian saya dengan MVC 5). Yang akan dipilih kemudian bergantung pada bagaimana Anda ingin mengingatkan pengguna bahwa ini adalah panjang teks maksimum. Dengan atribut stringlength, pengguna tidak akan bisa mengetik di luar panjang yang diizinkan. Atribut maxlength tidak menambahkan atribut html ini, melainkan menghasilkan atribut validasi data, yang berarti pengguna dapat mengetik di luar panjang yang ditunjukkan dan bahwa mencegah input lebih lama tergantung pada validasi dalam javascript ketika ia pindah ke bidang berikutnya atau klik kirim (atau kirim jika javascript dinonaktifkan, validasi sisi server). Dalam hal ini pengguna dapat diberitahu tentang pembatasan oleh pesan kesalahan.

Koen
sumber