在ASP.net MVC应用程序中设置区域性/UI区域性的最佳位置是什么
目前我有一个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菜鸟,所以我不相信我把它设置在正确的位置。我不想在web.config级别上这样做,它必须基于用户的选择。我也不想检查他们的http-header来从他们的浏览器设置中获取文化。
编辑:
我只是想说清楚--我并不是想决定是否使用会话。我对这一点很满意。我想弄清楚的是,最好是在一个为每个要设置的文化都有一个操作方法的文化控制器中做这件事,还是在MVC管道中有一个更好的地方来做这件事?
发布于 2009-10-13 17:02:24
我使用这个localization method并添加了一个路由参数,每当用户访问example.com/xx-xx/时,该参数设置区域性和语言。
示例:
routes.MapRoute("DefaultLocalized",
"{language}-{culture}/{controller}/{action}/{id}",
new
{
controller = "Home",
action = "Index",
id = "",
language = "nl",
culture = "NL"
});
我有一个过滤器,它执行实际的文化/语言设置:
using System.Globalization;
using System.Threading;
using System.Web.Mvc;
public class InternationalizationAttribute : ActionFilterAttribute {
public override void OnActionExecuting(ActionExecutingContext filterContext) {
string language = (string)filterContext.RouteData.Values["language"] ?? "nl";
string culture = (string)filterContext.RouteData.Values["culture"] ?? "NL";
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));
}
}
要激活国际化属性,只需将其添加到您的类中:
[Internationalization]
public class HomeController : Controller {
...
现在,只要访问者访问http://example.com/de-DE/Home/Index,就会显示德语站点。
我希望这个答案给你指明了正确的方向。
我还制作了一个小的MVC5示例项目,您可以在其中找到here
只需转到http://{yourhost}:{port}/en-us/home/index查看英语(美国)的当前日期,或者将其更改为http://{yourhost}:{port}/de-de/home/index以表示德语等。
发布于 2009-10-13 16:44:56
我会在控制器的Initialize事件中这样做...
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
base.Initialize(requestContext);
const string culture = "en-US";
CultureInfo ci = CultureInfo.GetCultureInfo(culture);
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
}
发布于 2009-10-13 15:05:13
由于它是按用户存储的设置,因此会话是存储信息的合适位置。
我会将控制器更改为接受区域性字符串作为参数,而不是为每个潜在的区域性使用不同的操作方法。向页面添加链接很容易,而且无论何时需要新的区域性,您都不需要重复编写相同的代码。
public class CultureController : Controller
{
public ActionResult SetCulture(string culture)
{
HttpContext.Session["culture"] = culture
return RedirectToAction("Index", "Home");
}
}
<li><%= Html.ActionLink("French", "SetCulture", new {controller = "Culture", culture = "fr-FR"})%></li>
<li><%= Html.ActionLink("Spanish", "SetCulture", new {controller = "Culture", culture = "es-ES"})%></li>
https://stackoverflow.com/questions/1560796
复制相似问题