Заменить строку регулярного выражения в атрибуте метаданных

Я пишу приложение, которое загружает языковые тексты из базы данных, чтобы включить интернационализацию, используя ключи в моделях просмотра, чтобы найти правильный текст. Я изменил версию MyLocalizationprovider с http://www.codeproject.com/Tips/514321/A-Simple-and-Effective-Way-to-Localize-ASP-Net-MVC, мой измененный код можно найти здесь : https://gist.github.com/TheConfuser/5f4a64ebe13254e7d45b. Код проходит через атрибуты метаданных и заменяет заголовок (DisplayName), заполнитель (Prompt), сообщение об ошибке (ErrorMessage) и сообщение об ошибке проверки (ErrorMessage). Я получаю DisplayAttribute для ErrorMessage, Prompt и Name, а также ValidationAttribute для ErrorMessage для проверки между двумя полями, в данном случае паролями. Вот такие ключи получаю:

if (typeName.Equals("DisplayAttribute"))
{
    nameKey = ((DisplayAttribute) attr).Name;
    placeholderKey = ((DisplayAttribute) attr).Prompt;
...

Затем я заменяю ключи значениями из своей базы данных. Мои модели просмотра выглядят следующим образом:

[Required(ErrorMessage = "changepassword_newpassword_error")]
[DataType(DataType.Password)]
[Display(Prompt = "changepassword_newpassword_placeholder", Name = "changepassword_newpassword_headline")]
[RegularExpression(@"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,12}", ErrorMessage = "changepassword_newpassword_regexerror")]
public string NewPassword { get; set; }

Это отлично работает для заполнителей, заголовков, сообщений об ошибках для поля и для проверки, однако я еще не знаю, как найти RegularExpression. Я думал, что он будет существовать в ValidationAttribute, как и его ErrorMessage, но я ничего не нашел там. См. http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute(v=vs.110).aspx.

Где я могу найти поле для строки регулярного выражения, оно вообще существует? Или я должен попытаться написать свой собственный атрибут (например, Установить RegularExpression динамически в модели), если да, может ли кто-нибудь помочь мне в пути?


person confuse    schedule 14.11.2014    source источник


Ответы (1)


После еще нескольких поисков я нашел больше ответов, которые привели меня к рабочему решению.

Во-первых, вместо того, чтобы слушать ValidationAttribute, который является большим классом атрибутов, я пошел вниз по цепочке и искал RequiredAttribute и CompareAttribute, помимо DisplayAttribute. С их помощью я мог найти ошибки сравнения, requirederrors, а также заголовок и заполнитель для поля ввода.

Я обнаружил, что существует атрибут RegularExpressionAttribute, в котором я могу найти поле Pattern, хотя я мог только получить значение, а не установить значение. Решением было реализовать собственный класс RegularExpressionAttribute, который наследуется от ValidationAttribute во многом как RegularExpressionAttribute. Однако использование его ванили не сработало, поскольку оно не возвращало никаких ошибок проверки. Решение - также унаследовать от IclientValidate. См. Полный код ниже.

public class CustomRegularExpressionValidateAttribute : ValidationAttribute, IClientValidatable
{
    public string Pattern { get; set; }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var password = (string)value;
        var match = Regex.Match(password, Pattern);
        if (!match.Success)
        {
            return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName));
        }

        return null;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRegexRule(FormatErrorMessage(metadata.GetDisplayName()), Pattern);
    }

}

Мой класс MyLocalizationProvider считывает атрибуты DisplayAttribute, CompareAttribute, RequiredAttribute и CustomRegularExpressionValidateAttribute и возвращает значения для указанных ключей в моделях просмотра. Строка в модели просмотра для класса выглядит так:

[CustomRegularExpressionValidate(Pattern = "PasswordRegex", ErrorMessage = "changepassword_newpassword_regexerror")]

И теперь работает полная цепочка. Надеюсь, это может кому-то помочь.

person confuse    schedule 24.11.2014