web-dev-qa-db-fra.com

Attributs StringLength vs MaxLength ASP.NET MVC avec le code EF Entity Framework EF d'abord

Quelle est la différence de comportement entre les attributs [MaxLength] et [StringLength]?

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

132
Nick Goloborodko

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

De MSDN:

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

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

De MSDN:

Spécifie le minimum et le maximum longueur des caractères autorisés dans un champ de données.

186
Swaff

Quelques informations supplémentaires rapides mais extrêmement utiles que je viens d'apprendre d'un autre message, mais ne paraissent pas retrouver la documentation (si quelqu'un pouvait partager un lien vers MSDN, ce serait génial):

Les messages de validation associés à ces attributs remplaceront en réalité 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; }

Emettra ce qui suit si le nombre de caractères dépasse la limite: "L'adresse peut avoir un maximum de 100 caractères"

Les espaces réservés que je connais sont les suivants:

  • {0} = Nom de la propriété 
  • {1} = longueur maximale 
  • {2} = Longueur minimale

Merci beaucoup à bloudraak pour l’avoir signalé au départ.

35
DamienMann

Voici les résultats lorsque nous utilisons les 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 colonne studentname 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; }
 }
8
gmail user

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

6
Abhishek Deo

MaxLengthAttribute signifie Max. longueur de données de tableau ou de chaîne autorisée

StringLengthAttribute signifie Min. et max. longueur des caractères autorisés dans un champ de données

Visitez http://joeylicc.wordpress.com/2013/06/20/asp-net-mvc-model-validation-using-data-annotations/

Un autre point à noter est dans l'attribut MaxLength, vous ne pouvez fournir que la plage requise max et non une plage requise min . En StringLength, vous pouvez fournir tous les deux.

3
Nilesh Moradiya

Lorsque vous utilisez l'attribut pour limiter la longueur maximale d'entrée de texte d'un formulaire sur une page Web, StringLength semble générer l'attribut html maxlength (du moins dans mon test avec MVC 5). Celui à choisir dépend ensuite de la façon dont vous voulez alerter l’utilisateur que c’est 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, mais génère des attributs de validation des données, ce qui signifie que l’utilisateur peut taper au-delà de la longueur indiquée et que, pour éviter une saisie plus longue, la validation en javascript est nécessaire lorsqu’il passe au champ suivant ou clique 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. 

0
Koen

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, [MaxLength] n'a pas fonctionné pour moi.

0
Zerotoinfinity