Минимальная длина Custom AbstractValidationAttribute и реализующий Castle.Components.Validator.IValidator - PullRequest
0 голосов
/ 21 апреля 2010

Я вижу, что с помощью валидаторов Castle я могу использовать атрибут проверки длины.

    [ValidateLength(6, 30, "some error message")]
    public string SomeProperty { get; set; }

Я пытаюсь найти атрибут MinLength only, есть ли способ сделать это с помощью атрибутов "из коробки"?

Пока моя идея заключается в реализации AbstractValidationAttribute

public class ValidateMinLengthAttribute : AbstractValidationAttribute

и заставить его метод Build возвращать MinLengthValidator, затем использовать ValidateMinLength для SomeProperty

public class MinLengthValidator : Castle.Components.Validator.IValidator

Кто-нибудь имеет пример полностью внедренного IValidator или знает, где такая документация существует? Я не уверен, что ожидают все методы и свойства.

Спасибо

1 Ответ

4 голосов
/ 22 апреля 2010

Если кому-то еще понадобится помощь, я опубликую пришедшую мне реализацию:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.ReturnValue | AttributeTargets.Parameter, AllowMultiple = true)]
public class ValidateMinLengthAttribute : AbstractValidationAttribute
{
    private IValidator validator;

    public ValidateMinLengthAttribute(int minLength)
    {
        validator = new MinLengthValidator(minLength);
    }

    public ValidateMinLengthAttribute(int minLength, string errorMessage) : base(errorMessage)
    {
        validator = new MinLengthValidator(minLength);
    }

    public override IValidator Build()
    {
        ConfigureValidatorMessage(validator);

        return validator;
    }
}

[Serializable()]
public class MinLengthValidator : AbstractValidator
{
    private int _minLength;
    private const string defaultErrorMessage = "Field must contain at least {0} characters";

    public MinLengthValidator(int minLength)
    {
        _minLength = minLength;
    }

    public override bool IsValid(object instance, object fieldValue)
    {
        if (fieldValue == null) return true;

        return fieldValue.ToString().Length >= _minLength;
    }

    public override bool SupportsBrowserValidation
    {
        get { return true; }
    }

    public override void ApplyBrowserValidation(BrowserValidationConfiguration config, InputElementType inputType, IBrowserValidationGenerator generator, System.Collections.IDictionary attributes, string target)
    {
        base.ApplyBrowserValidation(config, inputType, generator, attributes, target);

        string message = string.Format(defaultErrorMessage, _minLength);
        generator.SetMinLength(target, _minLength, ErrorMessage ?? message);
    }

    protected override string BuildErrorMessage()
    {
        return string.Format(defaultErrorMessage, _minLength);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...