具有继承的企业库验证应用程序块

时间:2010-06-25 05:46:04

标签: .net validation enterprise-library validation-application-bl

我正在使用企业库验证应用程序块。

抽象A类 { public int fieldA; }

B级:A { }

我在类型B中添加验证器。我无法找到字段fieldA,即使我在配置中输入它,验证也不会成功。 VAB是否不考虑抽象类和继承的属性或字段?

2 个答案:

答案 0 :(得分:2)

我做了一个测试,这对基类和抽象基类工作正常。你可以发布你的配置吗?

在处理字段时,请注意不要使用属性验证XML(反之亦然)。

根据您的上述示例,您的配置应如下所示:

  <validation>
    <type assemblyName="MyProject.Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
      name="MyProject.Test.B">
      <ruleset name="RuleSetB">
        <fields>
          <field name="fieldA">
            <validator lowerBound="1" lowerBoundType="Inclusive" upperBound="100"
              upperBoundType="Inclusive" negated="false" messageTemplate="fieldA must be between 1 and 100"
              messageTemplateResourceName="" messageTemplateResourceType=""
              tag="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.RangeValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=4.1.0.0, Culture=neutral, PublicKeyToken=null"
              name="Range Validator" />
          </field>
        </fields>
      </ruleset>
    </type>
  </validation>

答案 1 :(得分:2)

VAB仅在使用属性时才支持继承。基于配置的验证不支持继承(您可以在FAQ here中阅读)。 entlib团队给出的工作是:

  

要解决此问题,您可以   复制验证规范   对于子类。

当然这项工作很糟糕,因为对于基类中的每一个更改,您可能必须将其复制到许多派生类型。这很脆弱且容易出错。因此,我构建了一个能够将基类中的验证复制到实现的解决方案。

在Stackoverflow上发布它的代码太多了,但你可以阅读我的博客文章here

我希望这会有所帮助。