0

我正在尝试在 MVC 应用程序中设置路由,以便可选语言“文件夹”位于顶层。

例如

site.com/jp/complexroute

... 是使用 complexroute 找到的页面的日文版

site.com/complexroute

... 是使用 complexroute 找到的页面的英文版本

我可以想到一种我认为可行的方法,即获取 RouteConfig.RegisterRoutes 中的整个路由映射列表,并制作第二组相同但具有仅限于已知语言设置的语言参数。这听起来对于编写和维护来说都是一个令人头疼的问题。

我尝试编写自定义 MvcHandler 并将其附加到路由。这让我可以提取部分请求并将其放入 RequestContext.RouteData 但是到调用它时,似乎已经选择了路由/控制器?

我想我希望在收到请求和选择路由之间发生一些事情,我可以在其中操作 url 并在对 RouteCollection 进行查找之前在 RequestContext.RouteData 中设置一个值。

这可能吗?

4

1 回答 1

0
        routes.MapRoute(
            name: "Default",
            url: "{lang}/{controller}/{action}/{id}",
            defaults: new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

您可以在 RouteData.Values["lang"] 中访问 lang

样品 >

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
internal sealed class DoLocalizeAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string cultureName = filterContext.RouteData.Values["lang"].ToString();
        SpecificCulture = new CultureInfo(cultureName);
        Thread.CurrentThread.CurrentCulture = SpecificCulture;
        Thread.CurrentThread.CurrentUICulture = SpecificCulture;
    }

    public CultureInfo SpecificCulture { get; set; }
}

然后在要本地化的每个控制器上应用此属性

样品 >

[DoLocalize]
public class AccountController : Controller
于 2013-09-07T06:48:53.990 回答