2012-04-25 3 views
8

Когда вы украшаете свойство объекта модели атрибутом Required и не указываете ErrorMessage или ResourceType/Name, вы получаете сообщение о проверке в интерполированной форме «Поле {0] обязательно.», Где param 0 - значение DisplayName атрибут этого свойства.MVC3: Как изменить общий текст сообщения об утверждении [Требуется]?

Я хочу изменить эту строку по умолчанию на что-то еще, но я хочу сохранить ее общий характер, то есть я не хочу указывать ErrorMessage или ResourceType/Name для каждого свойства объекта модели. Где хранится строка по умолчанию и как ее изменить?

ответ

6

Получая свой собственный атрибут справедливый вариант, и, вероятно, имеет самую низкую нагрузку, чтобы начать работу, но вы должны вернуться назад и изменить все существующие виды использования [Required]. Вам (и всем остальным в вашей команде) также необходимо будет запомнить (и научить новичков использовать) правильное движение вперед.

Альтернативой является замена ModelMetadataProviders и ModelValidatorProviders для возврата строк из файла ресурсов. Это позволяет избежать недостатков выше. Он также закладывает основу для замены сообщений для других атрибутов (например, MaxLengthAttribute) и для поддержки дополнительных языков.

protected void Application_Start() 
{ 
    var stringProvider = new ResourceStringProvider(Resources.LocalizedStrings.ResourceManager); 
    ModelMetadataProviders.Current = new LocalizedModelMetadataProvider(stringProvider); 
    ModelValidatorProviders.Providers.Clear(); 
    ModelValidatorProviders.Providers.Add(new LocalizedModelValidatorProvider(stringProvider)); 
} 

Вот полный source, documentation и blog post, описывающий использование.

6

Вы пытались создать производный класс RequiredAttribute и переопределить метод FormatErrorMessage? Это должно работать:

public class MyRequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute 
{ 
    public override string FormatErrorMessage(string name) 
    { 
     return base.FormatErrorMessage(string.Format("This is my error for {0}", name)); 
    } 
} 
+0

Да, но я должен прочитать свойство метаданных 'DisplayName' в конструкторе' MyRequiredAttribute' (вместо того, чтобы передавать его явно), так как у меня уже есть/требуется отображение DisplayName. –

+1

В соответствии с приведенной ниже ссылкой параметром «имя» является имя, которое должно быть включено в форматированное сообщение. Http: //msdn.microsoft.com/en-us/library/system.component.dataannotations.validationattribute.formaterrormessage. ASPX – Joshua

Смежные вопросы