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?
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?
Respostas:
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.
MaxLengthAttribute
, enquanto EF reconheceStringLengthAttribute
[MaxLength]
tem um ErrorMessage então?
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:
Muito obrigado a bloudraak por inicialmente apontar isso.
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 studentname
coluna 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; }
}
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.
MaxLengthAttribute significa Max. comprimento dos dados da matriz ou da sequência permitidos
StringLengthAttribute significa Min. e max. comprimento de caracteres permitidos em um campo de dados
Visite http://joeylicc.wordpress.com/2013/06/20/asp-net-mvc-model-validation-using-data-annotations/
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 .
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.
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.