2013-10-17 26 views
3

我有一個過濾器,設置當前線程的CurrentUICulture將值從cookie獲取篩選模型驗證之前執行

拉,我有一個正在使用FluentValidation庫

驗證模型
[Validator(typeof(MyInputModelValidator))] 
public class MyInputModel 


public class MyInputModelValidator: AbstractValidator<MyInputModel> 
    { 
     public MyInputModelValidator() 
     { 
      var x = Thread.CurrentThread.CurrentUICulture.Name; 
      RuleFor(o => o.Country).NotEmpty().WithMessage(Resources.NoCountryError); 

我想線程文化通過這一點,因此對拉錯誤消息

正確的語言,如果我把一個破發點上的驗證上面我可以看到線程具有錯誤的文化改變。

如果我再運行代碼,它就會撞擊在過濾器一個破發點,其改變線程的文化

我怎樣才能使過濾器的代碼運行模型驗證踢前

我已經嘗試將控制器操作方法與過濾器屬性一起裝飾並全局應用,例如

GlobalConfiguration.Configuration.Filters.Add(new LocalizationApiFilter()); 

這是網頁API,而不是MVC,但其中的概念是相同的

什麼想法?

回答

5

我怎樣才能使模型驗證踢之前運行過濾器代碼

我覺得這是不可能的。模型綁定發生在流水線中的操作過濾器運行之前。 ASP.NET Web API管道是可以擴展但不能修改的東西。您可以通過使用除過濾器之外的其他設置來消除這種情況,例如消息處理程序。授權過濾器也在模型綁定之前運行,但授權過濾器用於授權,可能不適合這種情況。

+0

消息處理程序的工作 - 感謝 – ChrisCa

+2

使用授權過濾器來處理這個問題是否存在任何主要問題,或者這只是不好的做法? – user441365

+0

模型綁定發生在動作過濾器之前,但這並不意味着之前也應該發生驗證。這是一個設計錯誤,強制驗證先於動作過濾器是沒有意義的。實際上,過濾器可能會撤銷客戶端請求,所以在這種情況下甚至不需要驗證(由於構建它的方式而導致不必要的開銷)。 – Alisson

相關問題