通过配置使用验证应用程序块时,不会调用自定义验证程序

时间:2010-01-07 17:14:06

标签: c# asp.net-mvc entity-framework validation-application-bl

我在配置文件中设置了一个规则集,它有两个验证器,其中一个是内置的NotNullValidator,另一个是自定义验证器。问题是我看到NotNullValidator命中,但不是我的自定义验证器。

自定义验证程序用于验证实体框架实体对象。

我已经使用调试器来确认NotNull被命中(我强制失败,因此我看到它设置了无效结果),但它从未进入自定义结果。

我使用MVC作为Web应用程序,因此我在该层的配置文件中定义了规则集,但我的自定义验证程序在另一个项目中定义。但是,我不认为这是一个问题,因为当我在Visual Studio 2008中使用企业库配置工具时,它能够为自定义验证器正确设置类型。同样,我相信自定义验证器很好,因为它构建正常,配置工具可以正确引用它。

有没有人知道问题可能是什么,甚至是做什么/尝试进一步调试?

以下是我的自定义验证程序的精简版本:

[ConfigurationElementType(typeof(CustomValidatorData))]
public sealed class UserAccountValidator : Validator
{
    public UserAccountValidator(NameValueCollection attributes)
        : base(string.Empty, "User Account")
    {
    }

    protected override string DefaultMessageTemplate
    {
        get { throw new NotImplementedException(); }
    }

    protected override void DoValidate(object objectToValidate,
        object currentTarget, string key, ValidationResults results)
    {

        if (!currentTarget.GetType().Equals(typeof(UserAccount)))
        {
            throw new Exception();
        }

        UserAccount userAccountToValidate = (UserAccount)currentTarget;

        // snipped code ...

        this.LogValidationResult(results,
            "The User Account is invalid", currentTarget, key);
    }
}

以下是Validation.config中我的规则集的XML(NotNull规则仅用于强制失败,因此我可以看到它被命中,而且确实如此):

<validation>
<type defaultRuleset="default" assemblyName="MyProj.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
  name="MyProj.Entities.UserAccount">
  <ruleset name="default">
    <properties>
      <property name="HashedPassword">
        <validator negated="true" messageTemplate="" messageTemplateResourceName=""
          messageTemplateResourceType="" tag="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.NotNullValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          name="Not Null Validator" />
      </property>
      <property name="Property">
        <validator messageTemplate="" messageTemplateResourceName=""
          messageTemplateResourceType="" tag="" type="MyProj.Entities.UserAccountValidator, MyProj.Entities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
          name="Custom Validator" />
      </property>
    </properties>
  </ruleset>
</type>
</validation>

以下是我调用验证的方式的简化版本:

                var type = entity.GetType()
                var validator = ValidationFactory.CreateValidator(type, "default", new FileConfigurationSource("Validation.config"))
                var results = validator.Validate(entity)

非常感谢任何建议!

谢谢,

克里斯

2 个答案:

答案 0 :(得分:2)

您不应将自定义验证程序配置为“属性验证程序”,而应将其配置为“自我验证程序”。将节点向上移动到配置中的节点正下方。这应该可以解决问题。

答案 1 :(得分:0)

对于自定义验证器,您必须将要设置验证器的字段的必需属性设置为“true”,即required =“true”