2

我即将实现一个类来表示验证错误。该类肯定会包含一个名为 Message 的字符串值,这是向用户显示的默认消息。我还需要一种方法来向程序员表示验证错误是什么。这个想法是应该有一种简单的方法来确定是否发生了特定的验证错误。

实现一个名为 Type 的字符串成员会很简单,但要确定 ValidationError 是否属于该类型,我需要记住描述该类型的字符串。

if (validationError.Type == "PersonWithoutSurname") DoSomething();

显然,我需要更强大的类型。枚举会很好:

if (validationError.Type == ValidationErrorType.PersonWithoutSurname) DoSomething();

但考虑到可能存在数百种验证错误,我最终可能会得到一个包含数百个值的丑陋枚举。

我还想到使用子类化:

if (validationError.GetType() == typeof(PersonWithoutSurnameValidationError)) DoSomething();

但是后来我的类库中散落着数百个类,每个类大部分都使用一次。

你们是做什么的?我可以花几个小时为这种事情苦恼。

回答提出我使用的建议的人。枚举建议是要击败的。

4

3 回答 3

3

我使用FluentValidation,您可以在其中为每个类设置规则,并为每个属性提供默认或可自定义的消息。

因为它是一个流畅的框架,你可以组合规则,例如:

RuleFor(customer => customer.Address)
   .NotNull().Length(20, 250).Contains("Redmond")
   .WithMessage(@"Address is required, it must contain 
    the word Redmond and must be between 20 and 250 characters in length.");

Customer 类的验证器的典型用法:

public class CustomerValidator: AbstractValidator<Customer> {
  public CustomerValidator() {
    RuleFor(customer => customer.Surname).NotEmpty();
    RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
    RuleFor(customer => customer.Company).NotNull();
    RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
    RuleFor(customer => customer.Address).Length(20, 250);
    RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
  }

  private bool BeAValidPostcode(string postcode) {
    // custom postcode validating logic goes here
  }
}

Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);

bool validationSucceeded = results.IsValid;
IList<ValidationFailure> failures = results.Errors;  
//Bind these error messages to control to give validation feedback to user; 
于 2010-07-29T15:56:19.990 回答
0

我真的不明白你为什么要惹这么多麻烦......

如果您正在执行其验证字段,那么我通常会添加一个正则表达式验证器 & 和一个必填字段验证器。对于某些字段,我确实为我自己的一组规则添加了自定义验证器。但就是这样。对于客户端和服务器端。我所做的只是一个 page.validate 命令,如果抛出错误,则意味着客户端脚本已被修改,我通常会重新加载页面作为响应。

另外,如果我想处理对单个值的检查,我使用

 System.Text.RegularExpressions.Regex.IsMatch(...

那么还有更多吗?如果有请指出。

于 2010-07-29T16:01:13.240 回答
-1

如果问题是存储类型(尤其是这样您可以添加新类型),那么 XML 中的配置文件或数据库驱动的东西怎么样?

使用 app.config,您可以拥有:

这将在代码中被调用:

//Generate the error somehow:
Validation.ErrorType = 
    ConfigurationManager.AppSettings["PersonWithoutSurnameValidationError"].Value;

//Handle the error
[Your string solution here]

这样,您就可以在代码之外的某个地方记录错误类型,以便更容易记住它们。另一方面,如果您的主要问题是存储以便您可以获得正确的类型来处理,请坚持使用枚举。

于 2010-07-29T16:00:51.793 回答