Атрибуты StringLength и MaxLength ASP.NET MVC с использованием Entity Framework EF Code

152

В чем разница в поведении [MaxLength]и [StringLength]атрибутах?

Насколько я могу сказать (за исключением того, что [MaxLength]можно проверить максимальную длину массива), они идентичны и несколько избыточны?

Ник Голобородько
источник
1
Я не уверен насчет ASP.NET MVC, но для EF не должно быть никакой разницы: stackoverflow.com/questions/5414611/…
Ладислав Мрнка
1
StringLength не влияет на размер столбца миграции при его изменении.
Кас Блум,
@CasBloem StringLength действительно получает EntityFramework и влияет на длину столбцов - по крайней мере, в версии 6.
jakejgordon

Ответы:

203

MaxLength используется для Entity Framework, чтобы определить размер поля строкового значения при создании базы данных.

Из MSDN:

Задает максимальную длину массива или строковых данных, разрешенных в свойстве.

StringLength - это аннотация данных, которая будет использоваться для проверки ввода пользователя.

Из MSDN:

Задает минимальную и максимальную длину символов, допустимых в поле данных.

Swaff
источник
10
Также обратите внимание, что по умолчанию MVC 3 не распознается MaxLengthAttribute, а EF распознаетStringLengthAttribute
marcind
15
Так что на самом деле в MaxLength нет необходимости, так как вы можете использовать StringLength в EF, а также выводить размер строкового поля. Почему тогда они даже создали MaxLength?
Мэтт Джонсон-Пинт
4
@MattJohnson - Кажется, я напомнил, что решение о создании нового атрибута MaxLength было принято за семантику, поскольку StringLength подразумевает строковые данные, но MaxLength может применяться и к двоичным данным. Но это чертовски неудобно.
Джош
1
@MartinSmith - я только что попробовал использовать StringLength, и он сработал для меня, и я использую EF6 RC1, поэтому я не думаю, что комментарии там правильные
Колин
5
Почему тогда [MaxLength]есть ErrorMessage?
Запнологика
46

Некоторая быстрая, но чрезвычайно полезная дополнительная информация, о которой я только что узнал из другого поста, но, похоже, не могу найти документацию (если кто-то может поделиться ссылкой на нее в MSDN, это было бы удивительно):

Сообщения проверки, связанные с этими атрибутами, фактически заменят заполнители, связанные с атрибутами. Например:

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

Выводит следующее, если оно превышает ограничение на количество символов: «Адрес может содержать не более 100 символов»

Заполнители, о которых я знаю, являются:

  • {0} = Имя свойства
  • {1} = максимальная длина
  • {2} = минимальная длина

Большое спасибо bloudraak за первоначальное указание на это.

DamienMann
источник
12

Ниже приведены результаты, когда мы используем оба [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; }
 }
пользователь Gmail
источник
7

Все хорошие ответы ... С точки зрения валидации я также заметил, что MaxLength проверяется только на стороне сервера, а StringLength - на стороне клиента.

Абхишек Део
источник
3

Еще один момент, на который следует обратить внимание, - в атрибуте MaxLength вы можете указать только максимальный необходимый диапазон, а не минимальный требуемый диапазон. В то время как в StringLength вы можете предоставить оба .

Нилеш Морадия
источник
4
Да, но, вероятно, именно поэтому есть атрибут MinLength
Ян Гриффитс,
1

Я решил это, добавив строку ниже в моем контексте:

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

Почему-то [MaxLength]у меня не получилось.

Zerotoinfinity
источник
0

При использовании атрибута для ограничения максимальной длины ввода текста из формы на веб-странице StringLength создает атрибут html maxlength (по крайней мере, в моем тесте с MVC 5). Затем выберите тот, который вы хотите предупредить пользователя, что это максимальная длина текста. С атрибутом stringlength пользователь просто не сможет печатать сверх допустимой длины. Атрибут maxlength не добавляет этот атрибут html, вместо этого он генерирует атрибуты проверки данных, что означает, что пользователь может печатать за пределами указанной длины, и что предотвращение более длинного ввода зависит от проверки в javascript, когда он перемещается в следующее поле или нажимает кнопку submit (или если JavaScript отключен, проверка на стороне сервера). В этом случае пользователь может быть уведомлен об ограничении сообщением об ошибке.

Koen
источник