Атрибуты StringLength vs MaxLength ASP.NET MVC с Entity Framework EF Code First

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

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

Ответ 1

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

Из MSDN:

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

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

Из MSDN:

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

Ответ 2

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

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

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

Выведет следующее, если оно превысило лимит символов: "Адрес может иметь не более 100 символов"

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 6

Еще одна точка, которую нужно отметить, - это атрибут Макс. длина, вы можете указать только требуемый диапазон max, а не мин. В StringLength вы можете предоставить оба.

Ответ 7

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

Ответ 8

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

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

Каким-то образом [MaxLength] не работал для меня.