在ASP.net MVC应用程序中设置Culture / UI Culture的最佳位置是什么
目前我有一个CultureController类,如下所示:
public class CultureController : Controller
{
public ActionResult SetSpanishCulture()
{
HttpContext.Session["culture"] = "es-ES";
return RedirectToAction("Index", "Home");
}
public ActionResult SetFrenchCulture()
{
HttpContext.Session["culture"] = "fr-FR";
return RedirectToAction("Index", "Home");
}
}
以及主页上每种语言的超链接,其链接如下:
<li><%= Html.ActionLink("French", "SetFrenchCulture", "Culture")%></li>
<li><%= Html.ActionLink("Spanish", "SetSpanishCulture", "Culture")%></li>
哪个工作正常,但我认为有一个更合适的方法来做到这一点 .
我正在使用以下ActionFilter http://www.iansuttle.com/blog/post/ASPNET-MVC-Action-Filter-for-Localized-Sites.aspx阅读文化 . 我是一个MVC菜鸟,所以我不相信我在正确的位置设置它 . 我不喜欢_160657的选择 . 我也不想检查他们的http-header以从他们的浏览器设置中获取文化 .
编辑:
只是要明确 - 我不是要决定是否使用会话 . 我很满意 . 我想要解决的是,如果最好在文化控制器中执行此操作,该控制器具有要设置的每个文化的操作方法,或者在MVC管道中是否有更好的位置来执行此操作?
8 回答
由于它是按用户存储的设置,因此会话是存储信息的适当位置 .
我会更改您的控制器以将文化字符串作为参数,而不是为每个潜在的文化使用不同的操作方法 . 添加页面链接很简单,只要需要新的文化,就不需要重复编写相同的代码 .
1:创建自定义属性并覆盖如下方法:
2:在App_Start中,找到FilterConfig.cs,添加此属性 . (这适用于整个应用程序)
而已 !
如果要为每个控制器/操作定义文化而不是整个应用程序,可以使用以下属性:
要么:
我知道这是一个老问题,但是如果你真的想让你使用你的ModelBinder(关于
DefaultModelBinder.ResourceClassKey = "MyResource";
以及viewmodel类的数据注释中指示的资源), the controller or even an ActionFilter is too late to set the culture .文化可以在
Application_AcquireRequestState
中设置,例如:EDIT
实际上有一个更好的方法使用 custom routehandler 根据网址设置文化,Alex Adamyan on his blog完美描述 .
所有要做的就是覆盖 GetHttpHandler 方法并在那里设置文化 .
我会在控制器的Initialize事件中这样做......
什么是最好的地方是你的问题 . 最好的地方是 Controller.Initialize 方法 . MSDN写道它是在构造函数之后和操作方法之前调用的 . 与覆盖OnActionExecuting相反,将代码放在Initialize方法中可以让您在类和属性上对所有自定义数据注释和属性进行本地化 .
例如,我的本地化逻辑来自注入我的自定义控制器的类 . 我可以访问此对象,因为在构造函数之后调用Initialize . 我可以执行Thread的文化分配,而不是正确显示每条错误消息 .
即使您的逻辑不在我提供的示例类中,您也可以访问 RequestContext ,它允许您拥有URL和 HttpContext 以及 RouteData ,您可以基本上执行任何解析 .
如果使用子域,例如像“pt.mydomain.com”来设置portuguese,则使用Application_AcquireRequestState将不起作用,因为它不会在后续缓存请求中调用 .
为了解决这个问题,我建议像这样实现:
在非缓存调用上调用函数Application_AcquireRequestState,这允许生成和缓存内容 . 在缓存的调用上调用GetVaryByCustomString以检查内容是否在缓存中可用,在这种情况下,我们再次检查传入的主机域值,而不是仅仅依赖当前的文化信息,这可能已针对新请求进行了更改(因为我们正在使用子域名) .
我正在使用这个localization method并添加了一个路由参数,可以在用户访问example.com/xx-xx/时设置文化和语言
例:
我有一个过滤器,可以进行实际的文化/语言设置:
要激活国际化属性,只需将其添加到您的类:
现在,只要访问者访问http://example.com/de-DE/Home/Index,就会显示德语站点 .
我希望这个答案能指出你正确的方向 .
我还做了一个小的MVC 5示例项目,你可以找到here
只需转到http:// : / en-us / home / index查看当前日期(英文),或将其更改为http:// : / de -de / home / index for German etcetera .