Пользовательский валидатор не вызывается при использовании блока приложения проверки через конфигурацию - PullRequest
2 голосов
/ 07 января 2010

Я установил набор правил в моем файле конфигурации, который имеет два валидатора, один из которых является встроенным NotNullValidator, а другой - пользовательский валидатор. Проблема в том, что я вижу попадание NotNullValidator, но не мой пользовательский валидатор.

Пользовательский валидатор используется для проверки объекта Entity Framework.

Я использовал отладчик для подтверждения нажатия NotNull (я вызвал условие сбоя, поэтому увидел, что он установил недопустимый результат), но он никогда не входит в пользовательский.

Я использую MVC в качестве веб-приложения, поэтому я определил набор правил в файле конфигурации на этом уровне, но мой пользовательский валидатор определен в другом проекте. Тем не менее, я бы не подумал, что это будет проблемой, потому что когда я использую инструмент конфигурирования Enterprise Library в 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);
    }
}

Вот XML моего набора правил в Validation.config (правило 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)

Любой совет будет высоко ценится!

Спасибо

Chris

Ответы [ 2 ]

2 голосов
/ 02 февраля 2010

Пользовательский валидатор должен быть настроен не как «валидатор свойства», а как «самопроверка». Переместите узел вверх прямо под узлом в вашей конфигурации. Это должно сработать.

0 голосов
/ 14 апреля 2010

для пользовательского валидатора вы должны установить обязательный атрибут поля, для которого вы устанавливаете валидатор, в значение «истина», т.е. обязательный = «истина»

...