2

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

抽象类 A { public int fieldA; }

B类:A { }

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

4

2 回答 2

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>
于 2010-06-25T20:27:38.533 回答
2

VAB 仅在使用属性时才支持继承。基于配置的验证不支持继承(您可以在此处阅读常见问题解答)。entlib 团队给出的解决方法是:

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

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

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

我希望这有帮助。

于 2010-06-29T16:53:43.373 回答