Как добавить проверенную длину поля в сообщение @Html.ValidationMessageFor для проверки клиента?

#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. Я обновил вопрос, предоставив более подробную информацию