【问题标题】:Multiple routes assigned to one method, how to determine which route was called?多个路由分配给一个方法,如何确定调用了哪个路由?
【发布时间】:2016-09-21 16:16:09
【问题描述】:

我目前正在开发一个小型 ASP.NET MVC 项目。该项目于几个月前发布。但是现在应该出于可用性和搜索引擎优化的原因进行更改。我决定使用属性路由来创建干净的 URL。

此时产品页面由以下人员调用:

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
}

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

【问题讨论】:

  • 您使用的是哪个版本的 MVC?您可以通过this.ControllerContext.RouteData 获取路线信息。
  • ASP.NET MVC 4.5.2 ,所以我认为 MVC 5 ,据我所知,早期版本不支持多个 Route 标签。谢谢你,我会检查一下!
  • 我问是因为如果你使用 Core MVC,你需要使用依赖注入来获得与 ControllerContext 等价的我相信。
  • @stephen.vakil 非常感谢您指出正确的方向!我用你的评论解决了我的问题。如果你想把它写下来作为答案,我会接受;)祝你有美好的一天!

标签: c# asp.net-mvc asp.net-mvc-routing attributerouting


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 另外,如果我们想要一个表单发布到与控制器操作一起使用的路由,我们可以在表单标签中使用这个命名路由,如下所示:&lt;form asp-route="@ViewContext.ActionDescriptor.AttributeRouteInfo.Name" ...&gt;
    【解决方案3】:
        [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
            }
        }
    

    这对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 2015-10-16
      • 2016-09-10
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多