0

長さ検証属性を使用できる Castle バリデータが表示されます。

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

MinLength のみの属性を見つけようとしていますが、すぐに使用できる属性でこれを行う方法はありますか?

これまでのところ、私の考えは AbstractValidationAttribute を実装しています

public class ValidateMinLengthAttribute : AbstractValidationAttribute

Build メソッドが MinLengthValidator を返すようにし、次に SomeProperty で ValidateMinLength を使用する

public class MinLengthValidator : Castle.Components.Validator.IValidator

完全に実装された IValidator の例を持っている人、またはそのようなドキュメントがどこにあるか知っている人はいますか?? すべてのメソッドとプロパティが何を期待しているのかわかりません。

ありがとう

4

1 に答える 1

4

他の誰かがこれについて助けを必要とする場合に備えて、私が思いついた実装を投稿します。

[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);
    }
}
于 2010-04-22T02:11:29.740 に答える