StringLength ve MaxLength ASP.NET MVC'yi Entity Framework EF Koduyla İlk Olarak özetler


152

Davranışları [MaxLength]ve [StringLength]nitelikleri arasındaki fark nedir ?

Bildiğim kadarıyla [MaxLength](bir dizinin maksimum uzunluğunu doğrulamak hariç ) bunlar aynı ve biraz gereksiz?


1
ASP.NET MVC hakkında emin değilim ama EF için fark olmamalı: stackoverflow.com/questions/5414611/…
Ladislav Mrnka

1
StringLength, değiştirdiğinizde geçiş sütun boyutunu etkilemez.
Cas Bloem

@CasBloem StringLength aslında EntityFramework tarafından alınır ve sütun uzunluklarını etkiler - en azından sürüm 6'da
jakejgordon

Yanıtlar:


203

MaxLength , Entity Framework için veritabanını oluştururken bir dize değeri alanının ne kadar büyük olacağına karar vermek için kullanılır.

MSDN'den:

Bir özellikte izin verilen maksimum dizi veya dize verisi uzunluğunu belirtir.

StringLength , kullanıcı girişinin doğrulanması için kullanılacak bir veri notudur .

MSDN'den:

Veri alanında izin verilen minimum ve maksimum karakter uzunluğunu belirtir.


10
Ayrıca, varsayılan olarak MVC 3'ün tanınmadığını MaxLengthAttribute, EF'in tanımadığını unutmayınStringLengthAttribute
marcind

15
EF'de StringLength kullanabildiğiniz ve ayrıca dize alanı boyutunu da etkilediği için MaxLength'ya gerçekten gerek yoktur. O zaman neden MaxLength oluşturdular?
Matt Johnson-Pint

4
@MattJohnson - StringLength dize verilerini ima ettiğinden ancak MaxLength ikili veri için de geçerli olabileceğinden, yeni bir MaxLength özniteliği oluşturma kararının anlambilim için olduğunu hatırlıyorum. Ama cehennem gibi sakıncalı olduğu kesin.
Josh

1
@MartinSmith - Sadece StringLength kullanmayı denedim ve benim için çalıştı ve EF6 RC1 kullanıyorum, bu yüzden yorumların doğru olduğunu düşünmüyorum
Colin

5
O zaman neden [MaxLength]bir ErrorMessage var?
Zapnologica

46

Başka bir yazıdan yeni öğrendiğim, ancak belgelerini bulamıyorum gibi görünen bazı hızlı ama son derece yararlı ek bilgiler (eğer MSDN'de inanılmaz bir bağlantı paylaşabilir):

Bu özniteliklerle ilişkili doğrulama iletileri aslında özniteliklerle ilişkili yer tutucuların yerini alacaktır. Örneğin:

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

Karakter sınırını aşarsa aşağıdakilerin çıktısını alır: "Adres en fazla 100 karakter içerebilir"

Farkında olduğum yer tutucular:

  • {0} = Mülk Adı
  • {1} = Maksimum Uzunluk
  • {2} = Minimum Uzunluk

Başlangıçta bunu işaret ettiği için bloudraak'a çok teşekkürler .


12

İn [MaxLength]ve [StringLength]özniteliklerini kullandığımızda sonuçlar aşağıdadır EF code first. Her ikisi de kullanılırsa [MaxLength]yarışı kazanır. Test sonucunu studentnameaşağıdaki sınıftaki sütunda görün

 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; }
 }

7

Tüm iyi cevaplar ... Doğrulama açısından bakıldığında, StringLength'un istemci tarafında da doğrulanırken MaxLength'nun yalnızca sunucu tarafında doğrulandığını fark ettim.




1

Bağlamımda aşağıdaki satırı ekleyerek çözdüm:

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

Her nasılsa, [MaxLength]benim için çalışmadı.


0

Bir web sayfasındaki bir formdaki metnin maksimum giriş uzunluğunu kısıtlamak için özniteliği kullanırken, StringLength, maxlength html özniteliğini (en azından MVC 5 ile yaptığım testte) oluşturuyor gibi görünüyor. Daha sonra seçilecek olan, kullanıcıyı bunun maksimum metin uzunluğu olduğu konusunda nasıl uyarmak istediğinize bağlıdır. Dize uzunluğu özniteliğiyle, kullanıcı izin verilen uzunluğun ötesinde yazamaz. Maxlength özniteliği bu html özniteliğini eklemez, bunun yerine veri doğrulama öznitelikleri oluşturur, yani kullanıcı belirtilen uzunluğun ötesinde yazabilir ve daha uzun girdinin önlenmesi, bir sonraki alana geçildiğinde veya gönder'i tıkladığında (veya javascript devre dışı bırakılmışsa, sunucu tarafı doğrulaması). Bu durumda kullanıcı, bir hata mesajı ile kısıtlama konusunda bilgilendirilebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.