我想创建一个不同语言的网站。我已经读到我可以创建一个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使用当前区域性来决定使用哪种格式。但不幸的是,ModelBinder在ActionFilter改变文化之前就被使用了。
如何在 ModelBinder变为活动之前更改文化ModelBinder?
发布于 2012-11-18 22:40:55
您可以实现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;
}
}发布于 2012-11-21 14:20:04
我通常通过在CurrentCulture中处理PreRequestHandlerExecute事件来设置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();
}
}发布于 2015-01-15 15:48:23
在模型绑定之前执行IAuthorizationFilter实例,从而允许您设置所需的区域性。
https://stackoverflow.com/questions/13445278
复制相似问题