2

我在配置文件中設置了一個規則集,其中有兩個驗證程序,其中一個是內置的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

優秀領域所需的屬性自定義的驗證,這是它,謝謝! – Chris 2010-02-03 12:07:31

0

你必須設置你設置的驗證器爲「真」,即要求=「真」

相關問題