StringLength проти MaxLength атрибутує ASP.NET MVC з кодом EF EF Entity


152

У чому різниця у поведінці [MaxLength]та [StringLength]ознаках?

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


1
Я не впевнений у ASP.NET MVC, але для EF не повинно бути різниці: stackoverflow.com/questions/5414611/…
Ladislav Mrnka

1
StringLength не впливає на розмір стовпців міграцій, коли ви змінюєте його.
Cas Bloem

@CasBloem StringLength насправді отримує EntityFramework і вплине на довжину стовпців - принаймні у версії 6.
jakejgordon

Відповіді:


203

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

Від MSDN:

Вказує максимальну довжину даних масиву або рядків, дозволених у властивості.

StringLength - це анотація даних, яка буде використана для перевірки введення користувача.

Від MSDN:

Вказує мінімальну та максимальну довжину символів, дозволених у полі даних.


10
Також зауважте, що за замовчуванням MVC 3 не розпізнається MaxLengthAttribute, тоді як EF розпізнаєStringLengthAttribute
відмічає

15
Тому дійсно немає потреби в MaxLength, оскільки ви можете використовувати StringLength в EF, і він також визначає розмір поля рядка. Чому тоді вони навіть створили MaxLength?
Метт Джонсон-Пінт

4
@MattJohnson - Я, мабуть, згадую, що рішення про створення нового атрибута MaxLength було для семантики, оскільки StringLength передбачає рядкові дані, але MaxLength може застосовуватися і до двійкових даних. Але це впевнено, як пекло незручно.
Джош

1
@MartinSmith - я просто спробував використовувати StringLength, і це працювало на мене, і я використовую EF6 RC1, тому я не думаю, що коментарі там є правильними
Колін

5
Чому [MaxLength]тоді з'являється ErrorMessage?
Zapnologica

46

Деякі швидкі, але надзвичайно корисні додаткові відомості, про які я щойно дізнався з іншої публікації, але не можу знайти документацію (якщо хтось може поділитися посиланням на неї в MSDN, що було б дивним):

Повідомлення перевірки, пов'язані з цими атрибутами, фактично замінять заповнювачі, пов’язані з атрибутами. Наприклад:

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

Виводиться наступне, якщо воно перевищує обмеження символів: "Адреса може містити максимум 100 символів"

Мені відомі заповнювачі місць:

  • {0} = Назва власності
  • {1} = Максимальна довжина
  • {2} = Мінімальна довжина

Велика подяка bloudraak за те, що спочатку на це вказали .


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; }
 }

7

Усі хороші відповіді ... З точки зору перевірки я також помітив, що MaxLength перевіряється лише на стороні сервера, а StringLength також перевіряється на стороні клієнта.



3

Один інший пункт , щоб записати в MaxLength атрибута може забезпечити тільки Макс необхідний діапазон не в хв потрібно діапазон. Перебуваючи в StringLength, ви можете забезпечити і те, і інше .


4
Так, але це, мабуть, тому також є атрибут MinLength
Ян Гриффітс

1

Я вирішив це, додавши нижній рядок у свій контекст:

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

Якось, [MaxLength]у мене не вийшло.


0

Використовуючи атрибут для обмеження максимальної довжини введення тексту з форми на веб-сторінці, StringLength, здається, генерує атрибут maxle length html (принаймні, в моєму тесті з MVC 5). Вибраний потім описує, як ви хочете попередити користувача, що це максимальна довжина тексту. За допомогою атрибута stringlength користувач просто не зможе набрати більше допустимої довжини. Атрибут maxlength не додає цей атрибут html, натомість він генерує атрибути перевірки даних, що означає, що користувач може вводити більше вказаної довжини, а те, що запобігання більш тривалому вводу залежить від перевірки в JavaScript, коли він перейде до наступного поля або натисне подання (або якщо JavaScript відключений, перевірка на стороні сервера). У цьому випадку користувач може бути повідомлений про обмеження за допомогою повідомлення про помилку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.