ASP.NET MVC 2: проверка данных DataAnnotations - PullRequest
1 голос
/ 29 мая 2010

У меня есть обязательный атрибут, который используется с ресурсами:

public class ArticleInput : InputBase
{
    [Required(ErrorMessageResourceType = typeof(ArticleResources), ErrorMessageResourceName = "Body_Validation_Required")]
    public string Body { get; set; }
}

Я хочу указать соглашение о ресурсах, например:

public class ArticleInput : InputBase
{
    [Required2]
    public string Body { get; set; }
}

В основном, Required2 реализуетзначения, основанные на этих данных:

ErrorMessageResourceType = typeof(ClassNameWithoutInput + Resources); // ArticleResources
ErrorMessageResourceName = typeof(PropertyName + "_Validation_Required"); // Body_Validation_Required

Есть ли способ достичь чего-то подобного?возможно мне нужно реализовать новый ValidationAttribute.

1 Ответ

1 голос
/ 29 мая 2010

Я не думаю, что это возможно или, по крайней мере, невозможно сделать без предоставления специального адаптера для атрибута. У вас нет никакого способа в конструкторе атрибута получить доступ к методу / свойству, к которому применяется атрибут. Без этого вы не сможете получить информацию о типе или имени свойства.

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

public class Required2AttributeAdapter
    : DataAnnotationsModelValidator<Required2Attribute>
{
    public Required2AttributeAdapter( ModelMetadata metadata,
                                      ControllerContext context,
                                      Required2Attribute attribute )
        : base( metadata, context, attribute )
    {
    }

    public override IEnumerable<ModelClientValidationRule>
        GetClientValidationRules()
    {
        // use this.ControllerContext and this.Metadata to find
        // the correct error message from the correct set of resources
        //
        return new[] {
            new ModelClientValidationRequiredRule( localizedErrorMessage )
        };
    }
}

Тогда в global.asax.cs

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof( Required2Attribute ),
    typeof( Required2AttributeAdapter )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...