.NET Core(2.1)Web API动态命名到控制器操作的路由

时间:2018-07-31 14:01:03

标签: c# .net-core asp.net-core-routing .net-core-2.1

我需要使用到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)
    {
    }
  }

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

2 个答案:

答案 0 :(得分:1)

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

var routeData = this.HttpContext.GetRouteData();
routeData.Values["controller"] = "Other";
string url = Url.RouteUrl(routeData.Values);
return Redirect(url);

答案 1 :(得分:0)

您可以返回RedirectToActionResult而不是RedirectResult来通过调用例如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);

UrlIUrlHelper

的实例