我已經設置了自定義提供程序,以允許從數據存儲而不是靜態代碼中設置驗證屬性。在我的.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不會被解僱。
對不起,我發佈了在其他問題的意見沒有意識到這是你的問題!據我所知,API控制器和標準控制器使用單獨的模型綁定器,因此問題可能是由於未將驗證器正確添加到正確的模型綁定器中。目前沒有在我的電腦上,但我會稍後看看它:) – Henry 2012-08-22 12:37:53
@HenryGarle是的,我剛剛測試過這一點,自定義驗證發佈到控制器時,但不是ApiController。不知道如何爲ApiController正確註冊它。 – Dave 2012-08-22 14:31:08
好吧,這是一個好的開始,而不是從ModelValidatorProvider繼承有什麼區別? – Henry 2012-08-22 15:31:15