Как работает StringLengthAttribute?

У меня возникли проблемы с использованием StringLengthAttribute при проверке моей модели с использованием Entity Framework и ASP.NET MVC3.

Моя модель основана на объекте Entity Framework, который имеет частичный класс, который использует атрибут MetadataType, чтобы сообщить MVC, который будет использоваться при поиске метаданных. Это показано в приведенном ниже коде:

[MetadataType(typeof(PartMetadata))]
public partial class Part { }

class PartMetadata
{
    [DisplayName("Part number")]
    [Required(ErrorMessage="* Required")]
    [StringLength(50, MinimumLength = 3, ErrorMessage = "* Part numbers must be between 3 and 50 character in length.")]
    public string Number { get; set; }

    [StringLength(255, MinimumLength=3,
        ErrorMessage="* Part descriptions must be between 3 and 255 characters in length.")]
    public string Description { get; set; }

    [DisplayName("Drawing required?")]
    public bool DrawingRequired { get; set; }
}

Проблема, с которой я столкнулась, заключается в том, что поле описания не проверяется правильно. Используя код ниже, моя модель проверяется как "ОК", и я перенаправляется на страницу "Индекс" моего контроллера, даже если поле описания оставлено пустым.

if (ModelState.IsValid)
{
    return RedirectToAction("Index");
 }
 else
 {
     return View();
  }

Если я добавлю RequiredAttribute в поле описания, тогда моя модель будет считаться находящейся в недопустимом состоянии, а моя форма будет перезагружена, показывая сообщение об ошибке по умолчанию требуемого атрибута. Если я впоследствии отредактирую поле описания, тогда появится сообщение об ошибке проверки, которое я установил в атрибуте длины строки.

Это как должен вести себя атрибут? Это не проблема декорирования свойств с обязательным атрибутом, но кажется противоречащим, поскольку поле не требуется. Я просто хочу убедиться, что если пользователь что-то вводит, он попадает в диапазон атрибута длины строки.

Ответ 1

Да, это правильное поведение. StringLength проверяет, что строка является определенной длиной, но не REQUIRE, чтобы ввести строку. Украсьте Описание с помощью [Обязательно], чтобы у вас было как требование к строке, так и StringLength предоставили ограничения на длину строки.

Ответ 2

Ключевое слово [Обязательный] обеспечивает проверку длины и значения, когда вызов находится в файле .cshtml. Вы не получите предупреждения о вводе для полей, которые не включены, но вы будете, если какое-либо из полей модели с использованием [Обязательно] невидимы и неправильно заполнены.

Таким образом, модель может использоваться без вызовов во все обязательные поля, и ваша веб-страница может собирать группы значений полей для модели через несколько страниц или использовать только включенные поля из .cshtml с использованием модели.

Ключевое слово:

 class PartMetadata
 {
     [Required]
     [DisplayName("Part number")]
     [Required(ErrorMessage="* Required")]
     [StringLength(50, MinimumLength = 3, ErrorMessage = "* Part numbers must be between 3 and 50 character in length.")]
     public string Number { get; set; }