ASP.NET MVC — Как использовать требуемое сообщение внутри EditorTemplates

#asp.net-mvc #asp.net-mvc-4 #razor #mvc-editor-templates

#asp.net-mvc #asp.net-mvc-4 #razor #mvc-редактор-шаблоны

Вопрос:

У меня есть простая модель:

     public abstract class Person
    {
        [Required(ErrorMessage = "Il nome è obbligatorio!!!")]
        [UIHint("txtGeneric")]
        [Display(Name = "Nome")]
        public string Name { get; set; }

        [Required(ErrorMessage = "Il cognome è obbligatorio!!!")]
        [UIHint("txtGeneric")]
        [Display(Name = "Cognome")]
        public string Surname { get; set; }

        [Required(ErrorMessage = "L'email è obbligatoria e deve essere in formato valido (nome@dominio.it)!!!")]
        [UIHint("txtEmail")]
        [Display(Name = "E-mail")]
        public string Email { get; set; }
}
  

Я создал внутри EditorTemplate файл txtGeneric.cshtml. Это похоже на это:

 @model string
<input name="@ViewData.TemplateInfo.HtmlFieldPrefix" id="@ViewData.TemplateInfo.HtmlFieldPrefix" data-validation="required" data-validation-error-msg="MESSAGE_TO_PUT" value="@Model" />
  

Я хочу знать, как использовать текстовое сообщение об ошибке требуемого атрибута для помещения в мой txtGeneric.cshtml-файл.
Как я могу это сделать?

Спасибо

Комментарии:

1. Существует два способа установить проверку. 1. @Html.ValidationSummary() // для полной модели 2. @Html.ValidationMessageFor(/*выражение */) // для выбранного свойства модели. Кажется, вам не хватает помощника по проверке.

2. Да, я знаю, что вспомогательный snd для проверки, который я добавлю раньше, то, что я хочу, немного отличается… Я хочу получить текстовое значение сообщения для required, которое я устанавливаю в модель внутри шаблона custon (для пользовательских целей javascript) … возможно ли это?!?

3. Вы можете использовать jquery и извлекать внутренний текст. проверьте отрисованный html-код помощника по проверке и получите его внутренний текст.

4. Мммм, неужели невозможно получить доступ к этому значению непосредственно в editortemplate ?!? Я хочу заполнить свойство самого шаблона

Ответ №1:

Это работает:

  @{
     string requiredMsg = "";
     foreach (var attr in @Html.GetUnobtrusiveValidationAttributes(@ViewData.TemplateInfo.HtmlFieldPrefix, @ViewData.ModelMetadata))
     {
         if (attr.Key == "data-val-required") {
             requiredMsg = attr.Value.ToString();
         }
     }
 }
  

или это:

  @{
     string requiredMsg = "";
     IEnumerable<ModelClientValidationRule> clientRules = ModelValidatorProviders.Providers.GetValidators(ViewData.ModelMetadata, ViewContext).SelectMany(v => v.GetClientValidationRules());
     foreach (ModelClientValidationRule rule in clientRules)
     {
         if (rule.ValidationType == "required")
         {
             requiredMsg = rule.ErrorMessage;
         }
     }
 }
  

Ответ №2:

Измените свой шаблон на этот:

    @model string
   @Html.TextBoxFor(m => m)
   @Html.ValidationMessageFor(model => model, "", new { @class = "text-danger" })
  

Комментарии:

1. Таким образом, сообщение о проверке должно находиться за пределами поля ввода, сгенерированного editortemplate … я хочу получить доступ только к тексту, и я хочу поместить внутрь самого результата ввода

2. Считайте значение data-val-required атрибута из генерируемого ввода <input data-val="true" data-val-required="Il nome è obbligatorio!!!" id="Name" name="Name" type="text" value="">

3. Нет, извините, но мой английский плох, как и мое объяснение. Я хочу получить текст сообщения внутри EditorTemplates что-то вроде @ViewData. TemplateInfo.HtmlFieldPrefix но для требуемого сообщения

4. @pinguinone Если вы используете @Html.EditorFor(m => m) , как предложил Мохсен, стандартный шаблон редактора будет использовать аннотации данных для создания соответствующих атрибутов data-val. Другими словами, вам не нужно ничего делать, если вы не собираетесь предоставлять пользовательские аннотации к данным. Но это совершенно отдельная проблема.