StringLength vs MaxLength-Attribute ASP.NET MVC mit Entity Framework EF-Code zuerst

152

Was ist der Unterschied im Verhalten [MaxLength]und in den [StringLength]Attributen?

Soweit ich das beurteilen kann (mit der Ausnahme, dass [MaxLength]die maximale Länge eines Arrays überprüft werden kann), sind diese identisch und etwas redundant?

Nick Goloborodko
quelle
1
Ich bin mir bei ASP.NET MVC nicht sicher, aber für EF sollte es keinen Unterschied geben: stackoverflow.com/questions/5414611/…
Ladislav Mrnka
1
Die Zeichenfolgenlänge wirkt sich nicht auf die Größe der Migrationsspalte aus, wenn Sie sie ändern.
Cas Bloem
@CasBloem StringLength wird tatsächlich von EntityFramework aufgenommen und wirkt sich auf die Spaltenlängen aus - zumindest in Version 6.
jakejgordon

Antworten:

203

MaxLength wird für das Entity Framework verwendet, um zu entscheiden, wie groß ein Zeichenfolgenwertfeld beim Erstellen der Datenbank sein soll.

Von MSDN:

Gibt die maximale Länge von Array- oder Zeichenfolgendaten an, die in einer Eigenschaft zulässig sind.

StringLength ist eine Datenanmerkung , die zur Validierung von Benutzereingaben verwendet wird.

Von MSDN:

Gibt die minimale und maximale Länge von Zeichen an, die in einem Datenfeld zulässig sind.

Swaff
quelle
10
Beachten Sie auch, dass MVC 3 standardmäßig nicht erkannt wird MaxLengthAttribute, während EF erkenntStringLengthAttribute
marcind
15
MaxLength ist also wirklich nicht erforderlich, da Sie StringLength in EF verwenden können und daraus auch die Größe des Stringfelds abgeleitet wird. Warum haben sie dann überhaupt MaxLength erstellt?
Matt Johnson-Pint
4
@MattJohnson - Ich erinnere mich an die Entscheidung, ein neues MaxLength-Attribut zu erstellen, aus Gründen der Semantik, da StringLength String-Daten impliziert, MaxLength jedoch auch für Binärdaten gelten kann. Aber es ist verdammt unpraktisch.
Josh
1
@ MartinSmith - Ich habe gerade versucht, StringLength zu verwenden, und es hat bei mir funktioniert, und ich verwende EF6 RC1, daher glaube ich nicht, dass die Kommentare dort korrekt sind
Colin
5
Warum gibt [MaxLength]es dann eine ErrorMessage?
Zapnologica
46

Einige schnelle, aber äußerst nützliche Zusatzinformationen, die ich gerade aus einem anderen Beitrag gelernt habe, für die ich jedoch anscheinend keine Dokumentation gefunden habe (wenn jemand einen Link auf MSDN teilen kann, wäre das erstaunlich):

Die diesen Attributen zugeordneten Validierungsnachrichten ersetzen tatsächlich die den Attributen zugeordneten Platzhalter. Beispielsweise:

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

Gibt Folgendes aus, wenn die Zeichenbeschränkung überschritten wird: "Die Adresse kann maximal 100 Zeichen enthalten."

Die mir bekannten Platzhalter sind:

  • {0} = Eigenschaftsname
  • {1} = Maximale Länge
  • {2} = Min. Länge

Vielen Dank an bloudraak für den ersten Hinweis.

DamienMann
quelle
12

Im Folgenden sind die Ergebnisse aufgeführt, wenn wir sowohl [MaxLength]als auch [StringLength]Attribute verwenden EF code first. Wenn beide verwendet werden, [MaxLength]gewinnt das Rennen. Siehe das Testergebnis in der studentnameSpalte in der folgenden Klasse

 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; }
 }
Google Mail-Benutzer
quelle
7

Alle guten Antworten ... Aus Sicht der Validierung habe ich auch festgestellt, dass MaxLength nur auf der Serverseite validiert wird, während StringLength auch auf der Clientseite validiert wird.

Abhishek Deo
quelle
3

Ein weiterer Punkt nach unten zu beachten ist , in MaxLength - Attribute Sie nur bieten können max erforderlichen Bereich keine min erforderlichen Bereich. In StringLength können Sie beides angeben .

Nilesh Moradiya
quelle
4
Ja, aber aus diesem Grund gibt es vermutlich auch ein MinLength-Attribut: msdn.microsoft.com/EN-US/library/gg696756(v=VS.110,d=hv.2).aspx
Ian Griffiths
1

Ich habe es gelöst, indem ich in meinem Kontext die folgende Zeile hinzugefügt habe:

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

Irgendwie hat [MaxLength]es bei mir nicht funktioniert.

Zerotoinfinität
quelle
0

Wenn Sie das Attribut verwenden, um die maximale Eingabelänge für Text aus einem Formular auf einer Webseite einzuschränken, scheint die StringLength das HTML-Attribut maxlength zu generieren (zumindest in meinem Test mit MVC 5). Die Auswahl hängt dann davon ab, wie Sie den Benutzer darauf hinweisen möchten, dass dies die maximale Textlänge ist. Mit dem Attribut stringlength kann der Benutzer einfach nicht über die zulässige Länge hinaus tippen. Das Attribut maxlength fügt dieses HTML-Attribut nicht hinzu, sondern generiert Datenvalidierungsattribute. Dies bedeutet, dass der Benutzer über die angegebene Länge hinaus tippen kann und dass das Verhindern längerer Eingaben von der Validierung in Javascript abhängt, wenn er zum nächsten Feld wechselt oder auf Senden klickt (oder Wenn Javascript deaktiviert ist, serverseitige Validierung. In diesem Fall kann der Benutzer durch eine Fehlermeldung über die Einschränkung informiert werden.

Koen
quelle