2012-01-22 66 views
1

如何在禁用自動驗證應用程序範圍(a la https://stackoverflow.com/a/6111442/236255)後手動執行DataAnnotationsModelValidatorProvider的工作。我問,因爲如何手動調用DataAnnotationsModelValidatorProvider(禁用後)?

  1. 我喜歡它是如何工作的,並希望利用它的功能,但
  2. 我通常需要做的,需要與數據庫對話,除了基於DataAnnotations通常驗證業務驗證。我可以在IValidatableObject.Validate方法中創建和處理我的L2S DataContext,但這似乎違背了向我的控制器注入服務和數據上下文的DI模式(與我的功能程序員的誘惑對抗,將我的服務編寫爲創建和處理數據上下文本身!)。

請注意,我不使用任何MVC客戶端驗證功能(我做所有POST作爲ajax,所以我從來沒有看到任何真正的客戶端驗證的好處)。

回答

0

首先,驗證:

var validation = new List<ValidationResult>(); 

bool valid = Validator.TryValidateObject(value, new ValidationContext(value, null, null), validation, validateAllProperties: true); 

然後將結果複製到ModelState中:

foreach (var item in validation) { 
    IList<string> memberNames = item.MemberNames.ToArray(); 

    if (memberNames.Count > 0) { 

     for (int i = 0; i < memberNames.Count; i++) 
     controller.ModelState.AddModelError(memberNames[i] ?? "", item.ErrorMessage); 

    } else { 
     controller.ModelState.AddModelError("", item.ErrorMessage); 
    } 
} 
+0

是的,謝謝@Max,這看起來像它會工作。但我最終轉向使用FluentValidation並將所有驗證責任移交給我的服務。 –