【问题标题】:Fluent Validation custom validationFluent Validation 自定义验证
【发布时间】:2012-10-31 13:33:44
【问题描述】:

我想在我的 MVC 项目中使用 Fluent Validation (http://fluentvalidation.codeplex.com) 制定 2 条规则。

当 Company 和 Name 都为空时,不会发生任何事情。 如果它们中的任何一个被填充,则也不应该发生任何事情。 如果没有填写公司或名称,请在两者处显示标签。 (错误信息可能相同)

到目前为止我已经尝试过了:

RuleFor(x => x.Name)
.NotEmpty()
.WithMessage("Please fill in the company name or the customer name")
.Unless(x => !string.IsNullOrWhiteSpace(x.Company));

RuleFor(x => x.Company)
.NotEmpty()
.WithMessage("Please fill in the company name or the customer name")
.Unless(x => !string.IsNullOrWhiteSpace(x.Name));

我尝试过When、Must 和Unless 的组合,但它们都不起作用。当我什么都不填时,这两个属性上不会显示任何错误。

谁能帮帮我?

【问题讨论】:

  • 所以没有人知道如何解决这个问题? :(
  • 我无法重现您的问题;我已经使用您的确切规则运行了一个简单的测试,它们似乎很好(即当 Name 和 Company 都为空时会失败)。问题可能在于将 FluentValidation 与 ASP.NET MVC 集成,即您的任何其他规则是否有效?
  • 这在正常情况下可以工作,但我应该让你们知道这个表单是用 ajax (jquery validate) 发布的。我注意到某些规则,例如何时、除非和必须在服务器端执行,因此如果没有总页面回发,就无法在客户端验证。 NotEmpty() 之类的某些规则在客户端确实有效,但When、Unless 和 Must 似乎需要页面回发来验证。
  • @Robin - 页面加载后表单中的输入是否附加到 DOM 中?
  • @TravisJ 是的,就是这样,服务器端验证正在 json 序列化到表单提交的网页。

标签: c# asp.net-mvc-3 validation


【解决方案1】:

从 cmets 看来,问题在于启用客户端验证,并且规则实际上在回发时起作用。如FluentValidation wiki 中所述,唯一支持的客户端规则是

  • NotNull/NotEmpty
  • 匹配(正则表达式)
  • InclusiveBetween(范围)
  • 信用卡
  • 电子邮件
  • EqualTo(跨属性相等比较)
  • 长度

所以基本上你想要实现的目标不支持开箱即用。

请查看自定义客户端 FluentValidation 规则的示例here

【讨论】:

    【解决方案2】:

    您可以添加两个带有 when 条件的规则:

    RuleFor(x => x.Name)
    .NotEmpty()
    .When(x => string.IsNullOrEmpty(x.Company))
    .WithMessage("Please fill in the company name or the customer name");
    
    RuleFor(x => x.Company)
    .NotEmpty()
    .When(x => string.IsNullOrEmpty(x.Name))
    .WithMessage("Please fill in the company name or the customer name");
    

    【讨论】:

    • 嗨,谢谢你的回答,但我应该更清楚。我尝试了这种方法,但由于某种原因它不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多