【问题标题】:Using a prefix in MVC routing在 MVC 路由中使用前缀
【发布时间】:2013-09-07 01:00:31
【问题描述】:

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

例如

site.com/jp/complexroute

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

site.com/complexroute

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

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

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

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

这可能吗?

【问题讨论】:

  • 不确定您是否能够使用您建议的方法实现解决方案,因为 RequestContext.RouteData 在路由之后或可能在路由期间才可用。当需要后面的参数时,我不相信有一种简单的方法可以在中间创建带有可选参数的路由。即使在英文版本的情况下,始终存在参数可能更容易。

标签: c# .net asp.net-mvc asp.net-mvc-4 routes


【解决方案1】:
        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

【讨论】:

  • 感谢用户,但我的问题是我没有很好的控制器/动作/id 路由映射可以使用。我有大量自定义路线,我正在尝试找到一种方法来映射这些路线,而不必使用前面的 lang 参数复制所有这些路线。
猜你喜欢
  • 2017-06-07
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 2016-06-08
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 2014-01-03
相关资源
最近更新 更多