#c# #asp.net-mvc #client-side-validation
#c# #asp.net-mvc #проверка на стороне клиента
Вопрос:
У меня в форме есть поле текстовой области «Описание».
@Html.ValidationMessageFor(m =gt; m.Opis, "", new { @class = "control-label text-danger" })
Свойство модели имеет следующие атрибуты:
[Display(Name = nameof(Global.Opis), ResourceType = typeof(Global))] [Required] [MaxLength(500)] public string Opis { get; set; }
Он отображается в виде следующего html:
lt;textarea class="form-control input-validation-error" cols="20" data-val="true" data-val-length="Pole Opis musi być ciągiem o maksymalnej długości 500." data-val-length-max="500" data-val-required="[Opis]: Pole musi być wypełnione." id="Opis" name="Opis" rows="5" aria-describedby="Opis-error" aria-invalid="true"gt;lt;/textareagt; lt;span class="control-label text-danger field-validation-error" data-valmsg-for="Opis" data-valmsg-replace="true"gt;lt;span id="Opis-error" class=""gt;[Opis]: Pole musi być wypełnione.lt;/spangt;lt;/spangt;
Это нормально, однако я хочу изменить шаблон сообщения на стороне клиента, чтобы он отображал также текущую длину поля описания. Что-то вроде:
Максимальная длина поля описания составляет 500. Вы ввели 510 символов.
Я попытался добавить пользовательский атрибут, полученный из атрибута MaxLengthAttribute, однако, похоже, что это решение предназначено только для проверки на стороне сервера, поскольку отладчик не использует метод isValid.
public class MaxLengthWithLengthMessageAttribute : MaxLengthAttribute { public MaxLengthWithLengthMessageAttribute(int maximumLength) : base(maximumLength) { } public override bool IsValid(object value) { string input = Convert.ToString(value); if (input.Length gt; base.Length) base.ErrorMessage = $"Pole może zawierać maksymalny ciąg {base.ErrorMessage} znaków. Wprowadzono {input.Length} znaków."; return base.IsValid(value); } } public class MaxLengthWithLengthMessageValidator : DataAnnotationsModelValidator { private string _errorMessage = "Pole może zawierać maksymalny ciąg #1 znaków. Wprowadzono #2 znaków."; private MaxLengthWithLengthMessageAttribute _attribute; public MaxLengthWithLengthMessageValidator(ModelMetadata metadata, ControllerContext context, MaxLengthWithLengthMessageAttribute attribute) : base(metadata, context, attribute) { _attribute = attribute; } public override IEnumerablelt;ModelClientValidationRulegt; GetClientValidationRules() { var rule = new ModelClientValidationRule { ErrorMessage = this._errorMessage, ValidationType = "maxlength" }; rule.ValidationParameters.Add("max", _attribute.Length); yield return rule; } }
Как вы это делаете?
Комментарии:
1. Я не думаю, что это будет необходимо в MVC, если у вас правильно настроена настройка ввода. Элемент управления, отображаемый с атрибутом maxLength в DOM, и для его превышения вы можете манипулировать DOM. Вот пример: lt;класс textarea=»управление формой» данные-val=»истинная» длина данных-val=»Описание поля должно быть строкой с максимальной длиной 100.» данные-длина-val-max=»100″ идентификатор=»Описание» максимальная длина=»100″ имя=»Описание»gt;lt;Класс textarea=»управление формой» данные-val=»истинная» длина данных-val=»Описание поля должно быть строкой с максимальной длиной 100.» данные-длина-val-max=»100″ id=»Описание» максимальная длина=»100″ имя=»Описание»gt;lt;/текстовая областьgt;
2. @pim3nt3l Он не отображает атрибут maxlength и позволяет фактически превысить лимит
Ответ №1:
Вы можете настроить StringLengthAttribute Class
, как показано ниже
public class MyStringLengthAttribute : StringLengthAttribute { public MyStringLengthAttribute(int maximumLength) : base(maximumLength) { } public override bool IsValid(object value) { string val = Convert.ToString(value); if (val.Length gt; base.MaximumLength) base.ErrorMessage = String.Format("Maximum length of Description field is {0}. You've entered {1} characters.",base.MaximumLength,val.Length); return base.IsValid(value); } }
Комментарии:
1. Я обновил вопрос, предоставив более подробную информацию