В чем разница в поведении [MaxLength]
и [StringLength]
атрибутах?
Насколько я могу сказать (за исключением того, что [MaxLength]
можно проверить максимальную длину массива), они идентичны и несколько избыточны?
В чем разница в поведении [MaxLength]
и [StringLength]
атрибутах?
Насколько я могу сказать (за исключением того, что [MaxLength]
можно проверить максимальную длину массива), они идентичны и несколько избыточны?
Ответы:
MaxLength используется для Entity Framework, чтобы определить размер поля строкового значения при создании базы данных.
Из MSDN:
Задает максимальную длину массива или строковых данных, разрешенных в свойстве.
StringLength - это аннотация данных, которая будет использоваться для проверки ввода пользователя.
Из MSDN:
Задает минимальную и максимальную длину символов, допустимых в поле данных.
MaxLengthAttribute
, а EF распознаетStringLengthAttribute
[MaxLength]
есть ErrorMessage?
Некоторая быстрая, но чрезвычайно полезная дополнительная информация, о которой я только что узнал из другого поста, но, похоже, не могу найти документацию (если кто-то может поделиться ссылкой на нее в MSDN, это было бы удивительно):
Сообщения проверки, связанные с этими атрибутами, фактически заменят заполнители, связанные с атрибутами. Например:
[MaxLength(100, "{0} can have a max of {1} characters")]
public string Address { get; set; }
Выводит следующее, если оно превышает ограничение на количество символов: «Адрес может содержать не более 100 символов»
Заполнители, о которых я знаю, являются:
Большое спасибо bloudraak за первоначальное указание на это.
Ниже приведены результаты, когда мы используем оба [MaxLength]
и [StringLength]
атрибуты, в EF code first
. Если оба используются, [MaxLength]
выигрывает гонку. Смотрите результат теста в studentname
столбце ниже класса
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; }
}
Все хорошие ответы ... С точки зрения валидации я также заметил, что MaxLength проверяется только на стороне сервера, а StringLength - на стороне клиента.
MaxLengthAttribute означает Макс. допустимая длина массива или строковых данных
StringLengthAttribute означает Мин. и макс. длина символов, допустимых в поле данных
Посетите http://joeylicc.wordpress.com/2013/06/20/asp-net-mvc-model-validation-using-data-annotations/
Еще один момент, на который следует обратить внимание, - в атрибуте MaxLength вы можете указать только максимальный необходимый диапазон, а не минимальный требуемый диапазон. В то время как в StringLength вы можете предоставить оба .
Я решил это, добавив строку ниже в моем контексте:
modelBuilder.Entity<YourObject>().Property(e => e.YourColumn).HasMaxLength(4000);
Почему-то [MaxLength]
у меня не получилось.
При использовании атрибута для ограничения максимальной длины ввода текста из формы на веб-странице StringLength создает атрибут html maxlength (по крайней мере, в моем тесте с MVC 5). Затем выберите тот, который вы хотите предупредить пользователя, что это максимальная длина текста. С атрибутом stringlength пользователь просто не сможет печатать сверх допустимой длины. Атрибут maxlength не добавляет этот атрибут html, вместо этого он генерирует атрибуты проверки данных, что означает, что пользователь может печатать за пределами указанной длины, и что предотвращение более длинного ввода зависит от проверки в javascript, когда он перемещается в следующее поле или нажимает кнопку submit (или если JavaScript отключен, проверка на стороне сервера). В этом случае пользователь может быть уведомлен об ограничении сообщением об ошибке.