Atributos StringLength vs MaxLength ASP.NET MVC com código EF do Entity Framework primeiro

152

Qual é a diferença de comportamento [MaxLength]e [StringLength]atributos?

Tanto quanto eu posso dizer (com a exceção que [MaxLength]pode validar o comprimento máximo de uma matriz), estes são idênticos e um pouco redundantes?

Nick Goloborodko
fonte
1
Eu não tenho certeza sobre o ASP.NET MVC, mas para EF deve haver nenhuma diferença: stackoverflow.com/questions/5414611/...
Ladislav Mrnka
1
O stringLength não afeta o tamanho da coluna de migrações quando você o altera.
Cas Bloem
@CasBloem StringLength que na verdade são apanhados por EntityFramework e terá impacto sobre comprimentos de coluna - pelo menos na versão 6.
jakejgordon

Respostas:

203

MaxLength é usado para o Entity Framework para decidir o tamanho do campo de valor da string ao criar o banco de dados.

Do MSDN:

Especifica o comprimento máximo dos dados da matriz ou da sequência permitidos em uma propriedade.

StringLength é uma anotação de dados que será usada para validação da entrada do usuário.

Do MSDN:

Especifica o comprimento mínimo e máximo de caracteres permitidos em um campo de dados.

Swaff
fonte
10
Além disso, observe que, por padrão MVC 3 não reconhecido MaxLengthAttribute, enquanto EF reconheceStringLengthAttribute
marcind
15
Portanto, realmente não há necessidade de MaxLength, pois você pode usar StringLength no EF e também infere o tamanho do campo da string. Por que então eles criaram MaxLength?
Matt Johnson-Pint
4
@MattJohnson - Parece que me lembro que a decisão de criar um novo atributo MaxLength foi para semântica porque StringLength implica dados de string, mas MaxLength também pode ser aplicado a dados binários. Mas com certeza é inconveniente.
Josh
1
@MartinSmith - Eu só tentei usar StringLength e funcionou para mim e eu estou usando EF6 RC1 então eu não acho que os comentários não estão corretas
Colin
5
Por que [MaxLength]tem um ErrorMessage então?
Zapnologica 12/08
46

Algumas informações adicionais rápidas, mas extremamente úteis, que acabei de aprender em outro post, mas não consigo encontrar a documentação (se alguém puder compartilhar um link para ele no MSDN, isso seria incrível):

As mensagens de validação associadas a esses atributos realmente substituirão os espaços reservados associados aos atributos. Por exemplo:

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

Produzirá o seguinte se estiver acima do limite de caracteres: "O endereço pode ter no máximo 100 caracteres"

Os espaços reservados que eu conheço são:

  • {0} = Nome da Propriedade
  • {1} = Comprimento máximo
  • {2} = comprimento mínimo

Muito obrigado a bloudraak por inicialmente apontar isso.

DamienMann
fonte
12

A seguir estão os resultados quando usamos os atributos [MaxLength]e [StringLength], em EF code first. Se ambos forem usados, [MaxLength]vence a corrida. Veja o resultado do teste na studentnamecoluna abaixo da turma

 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; }
 }
usuário do gmail
fonte
7

Todas as boas respostas ... Do ponto de vista da validação, também notei que o MaxLength é validado apenas no lado do servidor, enquanto StringLength também é validado no lado do cliente.

Abhishek Deo
fonte
3

Outro ponto a ser observado é no atributo MaxLength, você pode fornecer apenas o intervalo máximo necessário e não o mínimo necessário. Enquanto em StringLength, você pode fornecer ambos .

Nilesh Moradiya
fonte
4
Sim, mas isso é provavelmente por isso que há também um atributo minLength: msdn.microsoft.com/EN-US/library/gg696756(v=VS.110,d=hv.2).aspx
Ian Griffiths
1

Eu o resolvi adicionando a linha abaixo no meu contexto:

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

De alguma forma, [MaxLength]não funcionou para mim.

Zerotoinfinity
fonte
0

Ao usar o atributo para restringir o comprimento máximo de entrada de texto de um formulário em uma página da Web, o StringLength parece gerar o atributo maxlength html (pelo menos no meu teste com o MVC 5). A pessoa a escolher depende de como você deseja alertar o usuário que esse é o tamanho máximo do texto. Com o atributo stringlength, o usuário simplesmente não poderá digitar além do comprimento permitido. O atributo maxlength não adiciona esse atributo html, mas gera atributos de validação de dados, o que significa que o usuário pode digitar além do comprimento indicado e impedir uma entrada mais longa depende da validação em javascript quando ele passa para o próximo campo ou clica em Enviar (ou se o javascript estiver desativado, validação no servidor). Nesse caso, o usuário pode ser notificado sobre a restrição por uma mensagem de erro.

Koen
fonte