StringLength vs MaxLength atribuye ASP.NET MVC con Entity Framework EF Code First

152

¿Cuál es la diferencia en el comportamiento [MaxLength]y los [StringLength]atributos?

Por lo que puedo decir (con la excepción de que [MaxLength]puede validar la longitud máxima de una matriz), ¿son idénticos y algo redundantes?

Nick Goloborodko
fuente
1
No estoy seguro acerca de ASP.NET MVC, pero para EF no debería haber diferencia: stackoverflow.com/questions/5414611/…
Ladislav Mrnka
1
StringLength no afecta el tamaño de la columna de migración cuando la cambia.
Cas Bloem
@CasBloem StringLength, de hecho, es recogido por EntityFramework e impactará en la longitud de las columnas, al menos en la versión 6.
jakejgordon

Respuestas:

203

MaxLength se usa para Entity Framework para decidir qué tan grande hacer un campo de valor de cadena cuando crea la base de datos.

De MSDN:

Especifica la longitud máxima de matriz o datos de cadena permitidos en una propiedad.

StringLength es una anotación de datos que se utilizará para validar la entrada del usuario.

De MSDN:

Especifica la longitud mínima y máxima de caracteres permitidos en un campo de datos.

Swaff
fuente
10
También tenga en cuenta que por defecto MVC 3 no reconoce MaxLengthAttribute, mientras que EF sí reconoceStringLengthAttribute
marcind
15
Entonces, realmente no hay necesidad de MaxLength ya que puede usar StringLength en EF y también infiere el tamaño del campo de cadena. ¿Por qué entonces incluso crearon MaxLength?
Matt Johnson-Pint
44
@MattJohnson: parece recordar que la decisión de crear un nuevo atributo MaxLength fue para la semántica porque StringLength implica datos de cadena, pero MaxLength también puede aplicarse a datos binarios. Pero seguro como el infierno es inconveniente.
Josh
1
@ MartininSmith - Acabo de intentar usar StringLength y funcionó para mí y estoy usando EF6 RC1, así que no creo que los comentarios sean correctos
Colin
55
¿Por qué [MaxLength]tiene un mensaje de error entonces?
Zapnologica
46

Alguna información adicional rápida pero extremadamente útil que acabo de aprender de otra publicación, pero parece que no puedo encontrar la documentación (si alguien puede compartir un enlace en MSDN sería increíble):

Los mensajes de validación asociados con estos atributos en realidad reemplazarán los marcadores de posición asociados con los atributos. Por ejemplo:

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

Producirá lo siguiente si supera el límite de caracteres: "La dirección puede tener un máximo de 100 caracteres"

Los marcadores de posición que conozco son:

  • {0} = Nombre de propiedad
  • {1} = Longitud máxima
  • {2} = Longitud mínima

Muchas gracias a bloudraak por señalar esto inicialmente.

DamienMann
fuente
12

Los siguientes son los resultados cuando usamos ambos [MaxLength]y [StringLength]atributos, en EF code first. Si se usan ambos, [MaxLength]gana la carrera. Vea el resultado de la prueba en la studentnamecolumna de la clase a continuación

 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; }
 }
usuario de gmail
fuente
7

Todas buenas respuestas ... Desde la perspectiva de la validación, también noté que MaxLength se valida solo en el lado del servidor, mientras que StringLength también se valida en el lado del cliente.

Abhishek Deo
fuente
3

Otro punto a tener en cuenta es en el atributo MaxLength , solo puede proporcionar el rango máximo requerido, no un rango mínimo requerido. Mientras estés en StringLength puedes proporcionar ambos .

Nilesh Moradiya
fuente
44
Sí, pero presumiblemente es por eso que también hay un atributo MinLength: msdn.microsoft.com/EN-US/library/gg696756(v=VS.110,d=hv.2).aspx
Ian Griffiths
1

Lo resolví agregando la siguiente línea en mi contexto:

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

De alguna manera, [MaxLength]no funcionó para mí.

Zerotoinfinity
fuente
0

Cuando se usa el atributo para restringir la longitud máxima de entrada para el texto de un formulario en una página web, StringLength parece generar el atributo html maxlength (al menos en mi prueba con MVC 5). El que elija luego depende de cómo desea alertar al usuario de que esta es la longitud máxima del texto. Con el atributo stringlength, el usuario simplemente no podrá escribir más allá de la longitud permitida. El atributo maxlength no agrega este atributo html, en su lugar genera atributos de validación de datos, lo que significa que el usuario puede escribir más allá de la longitud indicada y que evitar una entrada más larga depende de la validación en JavaScript cuando se mueve al siguiente campo o hace clic en enviar (o si javascript está deshabilitado, validación del lado del servidor). En este caso, el usuario puede ser notificado de la restricción mediante un mensaje de error.

Koen
fuente