在 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();
}
...
}
至于为什么它不起作用,不幸的是,如果不查看代码或比较两个版本中的路由,您将没有任何合乎逻辑的答案。
我有在应用程序启动时运行的代码,它为我的所有路由添加 {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();
}
...
}
至于为什么它不起作用,不幸的是,如果不查看代码或比较两个版本中的路由,您将没有任何合乎逻辑的答案。