如何解决在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 举报,一经查实,本站将立刻删除。