2011-08-26 34 views
14

Şu anda, istek için doğru kültür ayarlarını belirlemek için rota değerlerini, çerezleri ve tarayıcı dilleri üstbilgisini kontrol eden GlobalizationFilter adlı küresel bir filtrem var:MVC3 küreselleşme: model bağlamadan önce global filtreye ihtiyaç var

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

Her şey çalışıyor, ancak model bağlama işlemi gerçekleşiyor gibi görünüyor küresel filtrelerden önce ve böylece model bağlayıcı, kültür ayarlarını dikkate almaz.

Bu, çift değerlerin, DateTime değerlerinin yorumlanmasında sorunlara yol açar.

Kültür algılama kodunu diğer konumlara taşıyabilirdim ancak seçeneklerimden hiçbirini beğenmedim:

  • Uygulamanın BeginRequest etkinliği. Bu noktada, yönlendirme gerçekleşmedi, bu yüzden URL'den /en-US/ kültür belirtecini manuel olarak elemeliyim. Bu kabul edilemez.

  • Denetleyici Initialize() yöntemi. Bu, tüm denetleyicilerim için bir temel sınıf yazmamı ve varolan denetleyicileri ondan devralmamı zorlaştırır. Bundan hoşlanmıyorum, ama daha iyi bir şey olmazsa bu çözümü tercih ederim.

İdeal olarak, "yönlendirme tamamlandı" ve "model bağlama başlar" olayları arasında kodumu enjekte etmenin bir yolunu bulmak istiyorum, ancak bu konuda MSDN/Google'da hiçbir şey bulamadım.

Ya da farkında olmadığım MVC3 küreselleşmesini ele almanın başka bir yolu var mı?

Herhangi bir katkı için şimdiden teşekkür ederiz.

cevap

15

Kültürü ayrı bir bileşen/sınıf olarak belirleyen kodu ayıklayın. Sonra alacağım beri (Application_Start olarak) uygulama için

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

kaydetmek sonra 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); } } 

ve çağırmadan önce kültür ayarlamak için sınıfını kullanır DefaultModelBinder türemiş bir ModelBinder oluşturmak nihayetinde bir özel model bağlayıcı, en iyi yol gibi görünüyor. Teşekkürler – Zruty

+0

Ancak, bir model ciltçi içinde istek çapında kültür ayarlama biraz karşı sezgisel görünüyor .. – Zruty

+0

kültürü elden önce saklamak, kültürü ayarlamak ve modeli bağlamak ve daha sonra özgün kültürü geri yükleyebilirsiniz. Özel bir model ciltleyici, MVC mimarisinde tek bir dikiştir, Tek Sorumluluk İlkesi argümanlarından rahatsızlık duyuyorsanız bunu başka yerlerde de uygulayabilirsiniz. Örneğin, kültürü belirleyen kendi rota işleyicinizi tanımlayabilirsiniz. Sürüş ilkelerinize bağlı. Test edilebilirlik önemliyse, test etmek zor olacak bir yere koymayın ('Application_BeginRequest' gibi) :) –