在 ASP.NET MVC 5.0 中工作的路由代码在 5.2 中不再工作

Routing code working in ASP.NET MVC 5.0 no longer works in 5.2

我有在应用程序启动时运行的代码,它为我的所有路由添加 {lang} 参数前缀。

目的是将任何 URL 如 /page 转换为 {lang}/page,其中 {lang} 是语言代码(“en”、“fr”... ).

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapMvcAttributeRoutes();

    foreach (var r in routes.OfType<Route>())
        r.Url = "{lang}/" + r.Url;
}

这在 ASP.NET MVC 5.0 上运行良好。例如,此操作在 /en/about-us/fr/about-us 上显示“关于”页面:

[Route("about-us", Name = "About")]
public ActionResult About()
{
    return View();
}

(在 OnActionExecuting 中读取 {lang} 参数并相应地设置 UI 文化。)

但是,它不再适用于 ASP.NET MVC 5.2.3。

在此版本中,页面仍可在 /abous-us/en/about-us/fr/about-us return 上访问 404。 好像没有考虑修改的路由。

我试图深入 MapMvcAttributeRoutes 进行故障排除,但看起来代码,尤其是 AttributeRoutingMapper class,在两个版本之间被完全重写了。

我可以做些什么来考虑我修改的路线吗?

在不修改已注册路由的情况下,首选方法是在控制器上使用 RoutePrefix 属性:

[RoutePrefix("{lang}")]
public class HomeController : Controller
{
    [Route("~/", Name = "Index")] // Use ~ to skip prefix or use optional {lang?} as prefix
    public ActionResult Index()
    {
        return View();
    }

    [Route("about-us", Name = "About")]
    public ActionResult About()
    {
        ViewBag.Message = "Your application description page.";

        return View();
    }

    [Route("contact", Name = "Contact")]
    public ActionResult Contact()
    {
        ViewBag.Message = "Your contact page.";

        return View();
    }
    ...
}

至于为什么它不起作用,不幸的是,如果不查看代码或比较两个版本中的路由,您将没有任何合乎逻辑的答案。