Как изменить свойство ErrorMessage проверки DataAnnotation в MVC2.0 - PullRequest
3 голосов
/ 12 апреля 2010

Моя задача - изменить свойство ErrorMessage атрибута проверки DataAnnotation в MVC2.0. Например, я должен иметь возможность передавать идентификатор вместо фактического сообщения об ошибке для свойства Model и использовать этот идентификатор для извлечения некоторого содержимого (сообщения об ошибке) из другой службы, например базы данных, и отображать это сообщение об ошибке в представлении вместо Я БЫ. Для этого мне нужно установить свойство ErrorMessage атрибута валидации DataAnnotation.

    [StringLength(2, ErrorMessage = "EmailContentID.")]
    [DataType(DataType.EmailAddress)]        
    public string Email { get; set; }

Это кажется простой задачей, просто переопределив DataAnnotationsModelValidatorProvider защищенное переопределение IEnumerable GetValidators (метаданные ModelMetadata, контекст ControllerContext, атрибуты IEnumerable)

Однако это кажется достаточно сложным.

а. Свойство ErrorMessage MVC DatannotationsModelValidator доступно только для чтения. Поэтому я не могу ничего установить здесь б. Свойство System.ComponentModel.DataAnnotationErrorMessage (получить и установить), которое уже установлено в MVC DatannotationsModelValidator, поэтому мы не можем установить снова. Если вы попытаетесь установить, вы получите сообщение об ошибке «Свойство не может быть установлено более одного раза…».

public class CustomDataAnnotationProvider : DataAnnotationsModelValidatorProvider
{
    protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes)
    {
        IEnumerable<ModelValidator> validators = base.GetValidators(metadata, context, attributes);

        foreach (ValidationAttribute validator in validators.OfType<ValidationAttribute>())
        {
            messageId = validator.ErrorMessage;
            validator.ErrorMessage = "Error string from DB And" + messageId ;
        }

        //......
    }
}

Может кто-нибудь, пожалуйста, помогите мне в этом?

Ответы [ 3 ]

2 голосов
/ 20 мая 2010

Вот вопрос: какова ваша мотивация к изменению свойства сообщения об ошибке?

Продумайте это очень тщательно, поскольку вы идете по пути, где вы запутываете то, что на самом деле происходит в приложении.Конечно, база данных informatino полезна, но на самом деле она не является частью проверки, и не должна быть.

Когда вы идете в этом направлении, вы, по сути, говорите, что проверка может быть недействительной только при наличиипроблема с базой данных.Я вижу две проблемы с этим:

  1. Это нарушает разделение интересов.Вы сообщаете об ошибке персистентности в модели, которая не там, где она произошла.
  2. Решение не может быть проверено модулем, так как вы должны задействовать базу данных.

Я некак один из двух выше.

Можете ли вы решить эту проблему?Возможно, если вы создадите свой собственный атрибут проверки.Я должен был бы проверить и убедиться, что это правильно.Другой вариант - попытаться выполнить пользовательскую проверку:

http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

Эта статья также может помочь вам двигаться в нужном вам направлении:

http://ryanrivest.com/blog/archive/2010/01/15/reusable-validation-error-message-resource-strings-for-dataannotations.aspx

Вы хотите решить это?Не совсем, если вы пытаетесь правильно разделить проблемы в своем приложении.Я не стал бы засорять свое сообщение об ошибке проверки (это недопустимо) ошибкой базы данных (я недействителен, но база данных также взорвалась).Просто мои два цента.

0 голосов
/ 17 февраля 2011

Также вы можете захотеть взглянуть на ValidationAttribute.FormatErrorMessage Method в msdn.

Этот метод форматирует сообщение об ошибке с помощью ErrorMessageString имущество. Этот метод добавляет имя поля данных, которое вызвало ошибка в отформатированном сообщении об ошибке. Вы можете настроить, как ошибка сообщение отформатировано путем создания производный класс, который отменяет это способ.

Быстрый образец (и не является окончательным примером)

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, 
                Inherited = true)]
public sealed class PostCodeValidationAttribute
    : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        if( value == null )
            return true;

        string postCode = value as string;
        if( string.IsNullOrEmpty(postCode) )
            return true;

        if ( !PostCode.IsValidPostCode(postCode, this.PostCodeStyle) )
            return false;

        return true;
    }

    public PostCodeStyle PostCodeStyle { get; set; } 

    public override string FormatErrorMessage(string name)
    {
        return string.Format(
            "{0} is not a valid postcode for {1}", name, PostCodeStyle);
    }
}

* Я опустил перечисление PostCodeStyle, а также класс PostCode для проверки почтового индекса.

0 голосов
/ 17 февраля 2011

Есть встроенные способы получения сообщения об ошибке через ресурс. Вместо поиска в базе данных для получения ресурса во время выполнения, сгенерируйте ресурсы из своей базы данных и используйте его для сообщений об ошибках.

Затем можно использовать ErrorMessageResourceName и ErrorMessageResourceType, чтобы позволить DataAnnotation выполнять поиск ресурса вместо жесткого кодирования определенной строки.

public sealed class MyModel
{
    [Required(
        ErrorMessageResourceName="MyDescriptionResource",
        ErrorMessageResourceType=typeof(MyCustomResource))]
    public string Description { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...