分配给一个方法的多个路由,如何确定调用哪个路由?

Joh*_*Doe 6 c# asp.net-mvc asp.net-mvc-routing attributerouting

我目前正在开发一个小型的ASP.NET MVC项目.该项目几个月前发布.但是现在应该针对可用性和SEO原因实施更改.我决定使用属性路由来创建干净的URL.

目前,产品页面通过以下方式调用:

hostname.tld /控制器/ GetArticle/1234

我定义了一个像这样的新Route:

[Route("Shop/Article/{id:int}/{title?}", Name = "GetArticle", Order = 0)]
public ActionResult GetArticle(int id, string title = null) {
    // Logic
}
Run Code Online (Sandbox Code Playgroud)

一切正常,但由于向后兼容性和SEO原因,旧的路线应该仍然可用.并使用HTTP状态代码301重定向到新URL.

我听说可以为一个动作分配多个路径,如下所示:

[Route("Shop/Article/{id:int}/{title?}", Name = "GetArticle", Order = 0)]
[Route("Controller/GetArticle/{id:int}", Name = "GetArticle_Old", Order = 1)]
public ActionResult GetArticle(int id, string title = null) {
    // Logic
}
Run Code Online (Sandbox Code Playgroud)

但我不知道这是一个很好的解决方案,或者如何确定调用哪条路线?

ste*_*kil 8

您可以查看在ControllerContext.RouteData使用多个路径进行一个操作时他们使用的路线.

public const string MultiARoute = "multiA/{routesuffix}";
public const string MultiBRoute = "multiB/subB/{routesuffix}";

[Route(MultiARoute)]
[Route(MultiBRoute)]
public ActionResult MultiRoute(string routeSuffix)
{

   var route = this.ControllerContext.RouteData.Route as Route;
   string whatAmI = string.Empty;

   if (route.Url == MultiARoute)
   {
      whatAmI = "A";
   }
   else
   {
      whatAmI = "B";
   }
   return View();
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我希望能够根据请求传递不同的视图,但它们基本上都使用相同的过程,并且不想对每个视图都进行操作。先前的答案似乎不再有效,所以这就是我想出的。这是 .Net Core 2.2。

 [HttpGet]
[Route("[controller]/ManageAccessView/{name}/{id}",Name = "ManageAccessView")]
[Route("[controller]/ManageAccessUsers/{name}/{id}", Name = "ManageAccessUsers")]
[Route("[controller]/ManageAccessKeys/{name}/{id}", Name = "ManageAccessKeys")]
public async Task<IActionResult> ManageAccessView(int id, string name)
{

  var requestedView = this.ControllerContext.ActionDescriptor.AttributeRouteInfo.Name;

  return View(requestedView);


}
Run Code Online (Sandbox Code Playgroud)

这将允许您将您的个人视图作为路由的名称并使用它们来设置视图。