1

我有一个验证类:

public sealed class ValidationSet : ValidationAttribute
{
    private List<string> _set = new List<string>();
    public ValidationSet(params string[] setOfValues)
    {
        _set = setOfValues.ToList();
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (!(_set.Select(s => s.ToLower()).Contains(value.ToString().ToLower())))
        {
            throw new Exception("not in the set");
        }
        return ValidationResult.Success;
    }
}

这是我使用它的方式:

public class Car
{
    [ValidationSet("honda", "gm")]
    public string CarMake{ get; set; }

}

当我通过以下方式实例化 Car 类时:

...
Car c = new Car();
c.CarMake = "ford";
...

什么都不会发生,如果我打印 c.CarMake,它会显示福特 - 验证没有发生。

我只是想知道我在这里想念什么。

谢谢!

4

2 回答 2

3

仅实例化类并分配字段不会调用 IsValid,您需要在检查 Car 的框架中使用该类,看到它在 CarMake 上有 ValidationAttribute 并将调用 IsValid。

在这个例子中 asp:DynamicValidator 正在做这项工作:

如何:自定义数据字段验证

于 2014-03-21T19:19:41.230 回答
1

我会研究 FluentValidation。您可以为 Car 创建一个验证器类。

public class CarValidator : AbstractValidator<Car>
{
    public CarValidator() {
        RuleFor(m => m.CarMake).Equal("gm").Equal("honda");
    }
}

用法:

var car = new Car { CarMake = "honda" };
var validator = new CarValidator();
if (validator.Validate(car).IsValid)
    // car is valid
于 2014-03-21T19:38:11.723 回答