【问题标题】:.NET Core (2.1) web API dynamic naming of routes to controller actions.NET Core (2.1) Web API 动态命名控制器操作的路由
【发布时间】:2018-07-31 14:01:02
【问题描述】:

我需要使用 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 中的前缀作为字符串动态更新? 我真的很需要它。

【问题讨论】:

  • 如果控制器名称可以更改,为什么不更改此代码?

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


【解决方案1】:

您可以尝试获取当前请求的 Route Data,更改控制器的名称并使用更新后的新 Route Data 生成一个 url:

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

【讨论】:

    【解决方案2】:

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

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

    或者使用RedirectToRoute

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

    生成网址

    Routing to controller actions in ASP.NET Core 文章中的URL Generation 部分展示了如何使用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 的一个实例

    【讨论】:

    • 感谢您的输入,在那种情况下它肯定会像那样工作。但我真的需要它作为字符串,因为我正在填充包含这些 URL 的响应模型。这就是为什么我不能使用控制器的 RedirectMethods。
    • 这种情况下可以使用IUrlHelper方法之一来生成链接,如URL Generation所示,如var url=Url.Action("OtherAction", "Other");
    • @PanagiotisKanavos monty 没有说出完整的故事,他的另一个请求在这里:stackoverflow.com/questions/51615005/…
    • 嗯,完整的故事是一个复杂的控制器做几件事,我有两个不同的问题。但是 SO 用户/版主也经常提醒我不要在一篇文章中问两个问题。
    猜你喜欢
    • 2017-10-01
    • 2019-03-11
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    相关资源
    最近更新 更多