Создать DataAnnotations [DisplayName] в строке формата MVC PropertyValueRequired? - PullRequest
1 голос
/ 17 марта 2011

желаемое поведение

Недокументированное необнуляемое свойство типа значения в модели автоматически получает сообщение проверки «Требуется значение», добавленное DefaultModelBinder. Вместо этого я хотел бы отобразить «Требуется значение для {Property DisplayName}».

Я могу заставить это работать точно так же, как для свойств DataAnnotated , используя шаблон string.format. Я также могу изменить литеральную строку по умолчанию для отображения из DefaultModelBinder в этом случае. Я добавил шаблонную строку в качестве ресурса: PropertyValueRequired -> "Information is required for {0}" согласно:

Asp.Net MVC 2 - Изменение строки PropertyValueRequired

Изменение сообщений об ошибках ModelState по умолчанию в ASP.NET MVC 3

Примеры здесь в StackOverflow указывают, что это возможно, как для MVC DefaultModelBinder, так и для DataAnnotations Validator. В обеих вышеуказанных ссылках автор указывает, что он делает это для DefaultModelBinder (но не может заставить работать другие аспекты).


Наблюдаемое поведение

К сожалению, он выводит дословно {0} из MVC DefaultModelBinder (где я вместо этого хочу вставить DisplayName).

Сообщения выше вводят в заблуждение? MVC3 поддерживает строку формата для PropertyValueInvalid, но не PropertyValueRequired? По соглашению я должен использовать только DataAnnotation, и если я вижу сообщение DefaultModelBinder, значит ли это, что я недостаточно обработан / оформлен?

Я думаю, что в следующем посте Дарин Димитров может сказать, что использовать шаблон невозможно. Цитата: "переопределить сообщение об ошибке по умолчанию требуется ... глобально, что было бы бесполезно."

ASP.NET MVC - Пользовательское сообщение проверки для типов значений


Почему я хочу это сделать (по запросу спрашивающего)

  • Когда я связываюсь со встроенным сложным типом, таким как Dictionary<string, int>, нет способа украсить (int) значение сообщением проверки, поэтому я получаю общее сообщение проверки (DefaultModelBinder, а не DataAnnotation) каждый член словаря.
  • Я ожидал (естественно, я думаю), что разбор сообщения локализованного требуемого ресурса должен работать одинаково независимо от того, какой слой его перехватывает.
  • Я отключил AddImplicitRequiredAttributeForValueTypes как популярный метод решения проблем с флажками и привязкой даты / времени, которые у меня были, что, похоже, усугубляет это функциональное несоответствие.
  • Просмотр имен в сообщении проверки раздела ошибочных недекорированных полей помогает сократить время отладки.

Ответы [ 2 ]

2 голосов
/ 17 марта 2011

У меня работает.Шаги:

  1. В App_GlobalResources/Messages.resx добавить Required => Information is required for {0}
  2. Украсить вашу модель:

    public class MyViewModel
    {
        [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Messages))]
        [DisplayName("Bar")]
        public string Foo { get; set; }
    }
    
  3. В представленииоставьте соответствующее поле пустым:

    @using (Html.BeginForm())
    {
        @Html.LabelFor(x => x.Foo)
        @Html.EditorFor(x => x.Foo)
        @Html.ValidationMessageFor(x => x.Foo)
        <input type="submit" value="OK" />
    }
    
  4. Если вы отправите форму, оставив пустым, появятся следующие сообщения: Information is required for Bar

1 голос
/ 17 марта 2011

Ответ MVC3 не поддерживает . Из источника MVC:

PropertyValueInvalid

string displayName = propertyMetadata.GetDisplayName();
string errorMessageTemplate = GetValueInvalidResource(controllerContext);
string errorMessage = String.Format(CultureInfo.CurrentCulture, errorMessageTemplate, modelState.Value.AttemptedValue, displayName);
modelState.Errors.Remove(error);
modelState.Errors.Add(errorMessage);

PropertyValueRequired

bindingContext.ModelState.AddModelError(modelStateKey, GetValueRequiredResource(controllerContext));

Я не смотрел дальше, но, вероятно, это связано с отсутствием доступа к элементу модели в некоторых сценариях пропущенных значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...