Attributs StringLength vs MaxLength ASP.NET MVC avec Entity Framework EF Code First

152

Quelle est la différence de comportement [MaxLength]et d' [StringLength]attributs?

Autant que je sache (à l'exception qui [MaxLength]peut valider la longueur maximale d'un tableau), ils sont identiques et quelque peu redondants?

Nick Goloborodko
la source
1
Je ne suis pas sûr d'ASP.NET MVC, mais pour EF, il ne devrait y avoir aucune différence: stackoverflow.com/questions/5414611/…
Ladislav Mrnka
1
Le stringLength n'affecte pas la taille de col des migrations lorsque vous la modifiez.
Cas Bloem
@CasBloem StringLength est en fait repris par EntityFramework et aura un impact sur la longueur des colonnes - au moins dans la version 6.
jakejgordon

Réponses:

203

MaxLength est utilisé pour Entity Framework pour décider de la taille d'un champ de valeur de chaîne lors de la création de la base de données.

Depuis MSDN:

Spécifie la longueur maximale des données de tableau ou de chaîne autorisée dans une propriété.

StringLength est une annotation de données qui sera utilisée pour la validation de l'entrée utilisateur.

Depuis MSDN:

Spécifie la longueur minimale et maximale des caractères autorisés dans un champ de données.

Swaff
la source
10
Notez également que par défaut MVC 3 n'est pas reconnu MaxLengthAttribute, alors StringLengthAttribute
qu'EF le
15
Il n'y a donc vraiment pas besoin de MaxLength puisque vous pouvez utiliser StringLength dans EF et qu'il déduit également la taille du champ de chaîne. Pourquoi alors ont-ils même créé MaxLength?
Matt Johnson-Pint
4
@MattJohnson - Je semble me rappeler que la décision de créer un nouvel attribut MaxLength était pour la sémantique car StringLength implique des données de chaîne, mais MaxLength peut également s'appliquer aux données binaires. Mais c'est vraiment gênant.
Josh
1
@MartinSmith - Je viens d'essayer d'utiliser StringLength et cela a fonctionné pour moi et j'utilise EF6 RC1 donc je ne pense pas que les commentaires soient corrects
Colin
5
Pourquoi y a-t-il [MaxLength]alors un ErrorMessage?
Zapnologica
46

Quelques informations supplémentaires rapides mais extrêmement utiles que je viens d'apprendre d'un autre article, mais que je n'arrive pas à trouver la documentation pour (si quelqu'un peut partager un lien vers celui-ci sur MSDN, ce serait incroyable):

Les messages de validation associés à ces attributs remplaceront en fait les espaces réservés associés aux attributs. Par exemple:

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

Affiche le message suivant s'il dépasse la limite de caractères: "L'adresse peut contenir au maximum 100 caractères"

Les espaces réservés dont je suis conscient sont:

  • {0} = Nom de la propriété
  • {1} = Longueur max.
  • {2} = Longueur minimale

Un grand merci à bloudraak pour l'avoir signalé au départ.

DamienMann
la source
12

Voici les résultats lorsque nous utilisons les deux attributs [MaxLength]et [StringLength], dans EF code first. Si les deux sont utilisés, [MaxLength]remporte la course. Voir le résultat du test dans la studentnamecolonne de la classe ci-dessous

 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; }
 }
utilisateur gmail
la source
7

Toutes les bonnes réponses ... Du point de vue de la validation, j'ai également remarqué que MaxLength est validé uniquement côté serveur, tandis que StringLength est également validé côté client.

Abhishek Deo
la source
3

Un autre point à noter est dans l' attribut MaxLength, vous ne pouvez fournir que la plage maximale requise et non une plage minimale requise. Dans StringLength, vous pouvez fournir les deux .

Nilesh Moradiya
la source
4
Oui, mais c'est probablement la raison pour laquelle il existe aussi un attribut MinLength
Ian Griffiths
1

Je l'ai résolu en ajoutant la ligne ci-dessous dans mon contexte:

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

D'une manière ou d'une autre, cela [MaxLength]n'a pas fonctionné pour moi.

Zérotoinfinité
la source
0

Lors de l'utilisation de l'attribut pour restreindre la longueur d'entrée maximale du texte d'un formulaire sur une page Web, StringLength semble générer l'attribut html maxlength (au moins dans mon test avec MVC 5). Celui à choisir dépend alors de la manière dont vous souhaitez alerter l'utilisateur qu'il s'agit de la longueur maximale du texte. Avec l'attribut stringlength, l'utilisateur ne pourra tout simplement pas taper au-delà de la longueur autorisée. L'attribut maxlength n'ajoute pas cet attribut html, à la place il génère des attributs de validation de données, ce qui signifie que l'utilisateur peut taper au-delà de la longueur indiquée et que la prévention d'une saisie plus longue dépend de la validation en javascript lorsqu'il passe au champ suivant ou clique sur Soumettre (ou si javascript est désactivé, validation côté serveur). Dans ce cas, l'utilisateur peut être informé de la restriction par un message d'erreur.

Koen
la source