Я установил набор правил в моем файле конфигурации, который имеет два валидатора, один из которых является встроенным 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