Как работает 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; }