В настоящее время я пытаюсь найти способ упростить использование ErrorMessage из DataAnnotations.После прочтения темы наиболее распространенное решение (создание класса на основе каждого атрибута и автоматическое определение ErrorMessageResourceName и ErrorMessageResourceType) меня не радует.Поэтому я решил переопределить ModelValidationProvider.
К сожалению, мне пришлось прибегнуть к Reflection в моем решении, и я хорошо осведомлен о стоимости производительности от этой техники.Я уже рассматриваю "кэширование" информации о свойствах для каждого modelValidator, чтобы мне не приходилось каждый раз запускать GetProperties.Любое другое предложение / критика для использования этого подхода?
public class LocalizedDataAnnotationsModelValidatorProvider : DataAnnotationsModelValidatorProvider
{
protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
{
var baseReturn = base.GetValidators(metadata, context, attributes);
var resourceManager = Validation.ResourceManager;
var culture = Thread.CurrentThread.CurrentUICulture;
foreach (var modelValidator in baseReturn)
{
var type = modelValidator.GetType();
var attributeProp = type.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance).FirstOrDefault(x => x.Name == "Attribute");
var attribute = attributeProp.GetValue(modelValidator, null) as ValidationAttribute;
if (attribute != null)
{
if (string.IsNullOrEmpty(attribute.ErrorMessage))
{
var attributeName = attribute.GetType().Name.Replace("Attribute", string.Empty);
attribute.ErrorMessage = resourceManager.GetString(attributeName, culture);
}
}
}
return baseReturn;
}
}