5

我已經設置了自定義提供程序,以允許從數據存儲而不是靜態代碼中設置驗證屬性。在我的.NET MVC 4項目中與客戶端驗證非常相稱,但我無法獲得服務器端驗證的工作。服務器端驗證與自定義DataAnnotationsModelValidatorProvider

CustomModelValidatorProvider的.cs:

 

    public class CustomModelValidatorProvider : DataAnnotationsModelValidatorProvider 
    { 
     protected override IEnumerable GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable attributes) 
     { 
      // set attributes from datastore here 

      return base.GetValidators(metadata, context, attributes); 
     } 
    } 

在我的Global.asax.cs我:

 

    protected void Application_Start() 
    { 
     ModelValidatorProviders.Providers.Clear(); 
     ModelValidatorProviders.Providers.Add(new CustomModelValidatorProvider()); 
    } 

並在Web API方法,我有:

 

    var validationResultList = new List(); 
    bool valid = Validator.TryValidateObject(myModelObject, new ValidationContext(myModelObject, null, null), validationResultList, true); 

這裏,有效永遠是真的。即使Jquery客戶端驗證顯示錯誤。在服務器端,我的自定義提供程序未用於應用數據註釋。當我在GetValidators()中設置斷點時,會在創建View時調用它,並正確顯示客戶端驗證程序,但在模型綁定到控制器時不會再次調用它。

我錯過了一步嗎?任何幫助是極大的讚賞!

UPDATE

自定義驗證正常工作當對象被髮布到一個控制器,但是當貼到ApiController不會被解僱。

+0

對不起,我發佈了在其他問題的意見沒有意識到這是你的問題!據我所知,API控制器和標準控制器使用單獨的模型綁定器,因此問題可能是由於未將驗證器正確添加到正確的模型綁定器中。目前沒有在我的電腦上,但我會稍後看看它:) – Henry 2012-08-22 12:37:53

+0

@HenryGarle是的,我剛剛測試過這一點,自定義驗證發佈到控制器時,但不是ApiController。不知道如何爲ApiController正確註冊它。 – Dave 2012-08-22 14:31:08

+0

好吧,這是一個好的開始,而不是從ModelValidatorProvider繼承有什麼區別? – Henry 2012-08-22 15:31:15

回答

3

我終於明白了這一點,這是一個非常簡單的答案。 ApiControllers只響應System.Web.Http.Validation命名空間中的提供程序,而不是用於常規控制器和客戶端驗證的System.Web.Mvc命名空間。

我實現了這兩個以實現ApiControllers中的客戶端驗證和服務器驗證。