Измените культуру перед использованием ModelBinder
Я хочу создать сайт на разных языках. Я уже читал, что могу создать ActionFilter , но у меня небольшая проблема:
Мне пришлось создать пользовательский ModelBinder для работы с английскими и немецкими числовыми форматами (123,456,789.1 vs. 123.456.789,1)
public class DecimalModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
string key = bindingContext.ModelName;
var v = ((string[])bindingContext.ValueProvider.GetValue(key).RawValue)[0];
float outPut;
if (float.TryParse(v, NumberStyles.Number, System.Globalization.CultureInfo.CurrentCulture, out outPut))
return outPut;
return base.BindModel(controllerContext, bindingContext);
}
}
Этот Модельбиндер использует текущую культуру, чтобы решить, какой формат используется.
Но, к сожалению, ModelBinder используется до того, как ActionFilter может изменить культуру.
Как я могу изменить культуру до в ModelBinder становится активным?
3 ответов:
Вы можете реализовать IHttpModule и задать культуру в BeginRequest, как показано здесь.
void context_BeginRequest(object sender, EventArgs e) { // eat the cookie (if any) and set the culture if (HttpContext.Current.Request.Cookies["lang"] != null) { HttpCookie cookie = HttpContext.Current.Request.Cookies["lang"]; string lang = cookie.Value; var culture = new System.Globalization.CultureInfo(lang); Thread.CurrentThread.CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = culture; } }
Я обычно устанавливаю
CurrentCultureиCurrentUICulture, обрабатывая событиеPreRequestHandlerExecuteвGlobal.asax.cs(вы также можете обрабатывать это событие вIHttpModule, как предложил Барри).Смысл в том, чтобы сделать это в случае, который происходит до того, как происходит привязка модели. Есть несколько других событий, которые происходят до этого, которые вы могли бы использовать.
Посмотрите на класс HttpApplication для получения информации о доступных событиях и порядке, в котором они находятся. поднятый.
public class MvcApplication : HttpApplication { protected void Application_PreRequestHandlerExecute(object sender, EventArgs e) { var culture = new CultureInfo("en-GB"); // Get the culture name from the route values / request querystring / form / cookie Thread.CurrentThread.CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = culture; } }Вы также можете сделать это, обработав событие
OnActionExecutingна вашемController(вы, вероятно, хотите создать базовый контроллер и сделать это там, а затем все ваши контроллеры наследуют от этого базового контроллера).public class MyBaseController : Controller { protected override void OnActionExecuting(ActionExecutingContext filterContext) { var culture = new CultureInfo("en-GB"); // Get the culture name from the route values / request querystring / form / cookie Thread.CurrentThread.CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = culture; base.OnActionExecuting(filterContext); } } public class MyController : MyBaseController { public ActionResult Index() { return View(); } }
Экземпляры
IAuthorizationFilterвыполняются до привязки модели, что позволяет задать необходимые культуры
Comments