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

Multiple routes assigned to one method, how to determine which route was called?

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

目前调用产品页面的是:

hostname.tld/Controller/GetArticle/1234

我这样定义了一条新路线:

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

一切正常,但由于向后兼容性和 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
}

但我不知道这是否是一个好的解决方案或如何确定调用了哪条路由?

您可以查看 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();
}

我希望能够根据请求传递不同的视图,但它们基本上都使用相同的流程,不想为每个视图执行操作。先前的答案似乎不再有效,所以这就是我想出的。这是.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);


}

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

    [HttpGet("api/route1")]
    [HttpGet("api/route2")]
    [HttpGet("api/route3")]
    public void example ()
    {
        string requestedRoute = this.ControllerContext.HttpContext.Request.Path.ToString();
        if(requestedRoute == "/api/route1"){
            //do something
        }
    }

这对我有用。