2011-08-26 21 views
14

Hiện nay, tôi có một bộ lọc toàn cầu gọi GlobalizationFilter để kiểm tra các giá trị lộ trình, các tập tin cookie và các ngôn ngữ trình duyệt tiêu đề để xác định các thiết lập văn hóa chính xác cho các yêu cầu mô hình:MVC3 toàn cầu: cần lọc toàn cầu trước khi ràng buộc

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    // determine cultureInfo 
    Thread.CurrentThread.CurrentCulture = cultureInfo; 
    Thread.CurrentThread.CurrentUICulture = cultureInfo; 
} 

Nó tất cả các công trình, nhưng quá trình ràng buộc mô hình dường như xảy ra trước các bộ lọc toàn cầu, và do đó, trình mô hình hóa không tính đến các thiết lập văn hóa.

Điều này dẫn đến các vấn đề với việc giải thích giá trị gấp đôi, DateTime giá trị, vv

tôi có thể di chuyển mã phát hiện văn hóa đến các địa điểm khác, nhưng tôi không thích bất kỳ tùy chọn của tôi:

  • Sự kiện của BeginRequest của ứng dụng. Tại thời điểm này, quá trình định tuyến đã không xảy ra, vì vậy, tôi sẽ phải tự tạo mã thông báo văn bản /en-US/ từ URL. Điều này không thể chấp nhận được.

  • Phương thức điều khiển Initialize() của Bộ điều khiển. Điều này sẽ buộc tôi phải viết một lớp cơ sở cho tất cả các bộ điều khiển của tôi, và kế thừa các bộ điều khiển hiện có từ nó. Tôi không thích điều này, nhưng tôi sẽ lựa chọn giải pháp này nếu không có gì tốt hơn.

Lý tưởng nhất, tôi muốn tìm một số cách để tiêm mã của tôi giữa "định tuyến hoàn thành" và "ràng buộc mô hình bắt đầu" sự kiện, nhưng tôi thấy không có gì trong MSDN/Google về vấn đề này.

Hoặc có thể có một số cách khác để xử lý toàn cầu hóa MVC3 mà tôi không biết?

Cảm ơn trước vì mọi đóng góp.

Trả lời

15

Trích xuất mã xác định văn hóa thành một thành phần/lớp riêng biệt. Sau đó tạo một ModelBinder rằng xuất phát từ DefaultModelBinder mà sử dụng lớp để thiết lập văn hóa trước khi gọi BindModel

public class CultureAwareModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     /* code that determines the culture */ 
     var cultureInfo = CultureHelper.GetCulture(controllerContext.HttpContext); 

     //set current thread culture 
     Thread.CurrentThread.CurrentCulture = cultureInfo; 
     Thread.CurrentThread.CurrentUICulture = cultureInfo; 

     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

và sau đó đăng ký nó cho các ứng dụng (trong Application_Start)

// register our own model binder as the default 
ModelBinders.Binders.DefaultBinder = new CultureAwareModelBinder(); 
+0

kể từ khi tôi đang đi để có được một mô hình tùy chỉnh chất kết dính cuối cùng anyway, nó có vẻ là cách tốt nhất. Cảm ơn – Zruty

+0

Tuy nhiên, việc thiết lập văn bản yêu cầu trong một trình mô hình có vẻ hơi phản trực giác .. – Zruty

+0

bạn có thể lưu trữ văn hóa trước khi tay, đặt văn hóa và liên kết mô hình và sau đó khôi phục lại văn hóa gốc. Một mô hình tùy chỉnh chất kết dính chỉ đơn giản là một đường may trong kiến ​​trúc MVC, bạn có thể thực hiện nó ở những nơi khác nếu bạn không thoải mái với các đối số nguyên tắc chịu trách nhiệm duy nhất. Ví dụ: bạn có thể xác định trình xử lý tuyến đường của riêng bạn để đặt văn hóa. Phụ thuộc vào nguyên lý lái xe của bạn. Nếu testability là quan trọng, đừng đặt nó ở đâu đó sẽ khó kiểm tra (như 'Application_BeginRequest') :) –