代码之家  ›  专栏  ›  技术社区  ›  monty

.NET核心(2.1)到控制器操作的路由的web API动态命名

  •  0
  • monty  · 技术社区  · 8 年前

    我需要使用到API控制器方法的路由作为重定向的前缀。

    当然,我可以对它们进行硬编码,但我更喜欢动态地获取它们,因此如果我更改路由或控制器名称,它将通过逻辑进行更新。

      [Route("api/v1/[controller]")]
      public class TestController : ControllerBase
      {
        [HttpGet("{path}")]
        public async Task<IActionResult> Get(string path)
        {
          string prefix = "api/v1/Other/"; //how to get that part dynamically?
          return Redirect(prefix + path);
        }
      }
    
      [Route("api/v1/[controller]")]
      public class OtherController : ControllerBase
      {
        [HttpGet("{path}")]
        public async Task<IActionResult> Get(string path)
        {
        }
      }
    

    如果路由注释或控制器名称更改,如何将TestController中的前缀作为字符串动态更新? 我真的很需要它。

    2 回复  |  直到 8 年前
        1
  •  1
  •   J.Loscos    8 年前

    您可以尝试获取当前请求的路由数据,更改控制器的名称,并使用更新的新路由数据生成url:

    var routeData = this.HttpContext.GetRouteData();
    routeData.Values["controller"] = "Other";
    string url = Url.RouteUrl(routeData.Values);
    return Redirect(url);
    
        2
  •  0
  •   Panagiotis Kanavos    8 年前

    您可以返回 RedirectToActionResult 而不是 RedirectResult 通过调用eg重定向到特定的控制器操作 RedirectToAction ,例如:

    return RedirectToAction("Other","OtherAction");
    

    或使用 RedirectToRoute :

    return RedirectToRoute(new {action="OtherAction",controller="Other"}); 
    

    生成URL

    这个 URL Generation 中的节 Routing to controller actions in ASP.NET Core 文章展示了如何使用 URL.Action 生成到另一个控制器操作的绝对链接。从示例中:

    var url = Url.Action("Buy", "Products", new { id = 17, color = "red" });
    return Content(url);
    

    使之适应问题:

    var url = Url.Action("OtherAction", "Other");
    return Redirect(url);
    

    Url IUrlHelper