我想用不同的语言创建一个网站。我已经读过我可以创建一个ActionFilter,但我有一个小问题:
我必须创建一个自定义的ModelBinder才能使用英语和德语数字格式(123,456,789.1
与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。
如何在模型生成器变为活动状态
之前更改文化?答案 0 :(得分:7)
您可以实现IHttpModule并在BeginRequest中设置文化,如here所示。
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;
}
}
答案 1 :(得分:6)
我通常通过处理CurrentCulture
中的CurrentUICulture
事件来设置PreRequestHandlerExecute
和Global.asax.cs
(您也可以按照IHttpModule
处理此事件。巴里)。
重点是在模型绑定发生之前发生的事件中执行此操作。在此之前还有其他一些事件可以使用。
查看HttpApplication Class以获取有关可用事件的信息,以及它们的引发顺序。
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();
}
}
答案 2 :(得分:4)
IAuthorizationFilter
的实例在模型绑定之前执行,因此允许您设置所需的文化