微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在ASP.NET MVC 5.0中工作的路由代码在5.2中不再起作用

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

目的是将/page之类的任何URL转换为{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();
}

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

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

在此版本上,页面仍可在/abous-us上访问,并且/en/about-us/fr/about-us返回404。 就像没有考虑修改的路由。

我试图深入研究MapMvcAttributeRoutes进行故障排除,但是看起来代码(尤其是AttributeRoutingMapper类)已在两个版本之间完全重写。

我可以采取任何措施来考虑修改后的路线吗?

解决方法

不修改已注册的路由,首选方法是在控制器上使用 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();
    }
    ...
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。