【问题标题】:Get the full route to current action获取当前操作的完整路径
【发布时间】:2017-01-06 18:01:44
【问题描述】:

我有一个带有基本路由的简单 API。它是使用默认的 Visual Studio 2015 ASP.NET Core API 模板设置的。

我有这个控制器和动作:

[Route("api/[controller]")]
public class DocumentController : Controller
{
    [HttpGet("info/{Id}")]
    public async Task<Data> Get(string Id)
    {
        //Logic
    }
}

所以要达到这个方法,我必须调用GET /api/document/info/some-id-here

.NET Core 是否可以在该方法中以字符串形式检索完整路由?

所以我可以这样做:

var myRoute = retrieveRoute();

// myRoute = "/api/document/info/some-id-here"

【问题讨论】:

  • 试试 [HttpGet("info/{Id?}")]
  • 我在那儿!感谢您的评论,但问题是关于在方法中检索为字符串,遵循到达该方法的路线。我的路由目前运行良好,我无法将 Id 设置为可选。
  • 好的,问题已编辑。

标签: c# asp.net-core .net-core asp.net-core-mvc


【解决方案1】:

您可以使用 .Net Core 中的 Request 选项 (HttpRequest) 获取完整的请求 url。

var route = Request.Path.Value;

你的最终代码。

[Route("api/[controller]")]
public class DocumentController : Controller
{
    [HttpGet("info/{Id}")]
    public async Task<Data> Get(string Id)
    {
        var route = Request.Path.Value;
    }
}

结果路由:“/api/document/info/some-id-here” //例如

【讨论】:

  • 这很好,当您的代码在操作中时。如果你需要一个动作的路径,比如说,在一个视图中?
【解决方案2】:

您也可以要求 MVC 根据当前路由值创建一个新的路由 URL:

[Route("api/[controller]")]
public class DocumentController : Controller
{
    [HttpGet("info/{Id}")]
    public async Task<Data> Get(string Id)
    {
        //Logic

        var myRoute = Url.RouteUrl(RouteData.Values);
    }
}

Url.RouteUrl 是一种帮助方法,可让您在给定任何路由值的情况下构建路由 URL。 RouteData.Values 为您提供当前请求的路由值。

【讨论】:

  • 感谢它也有效!例如,您知道如何过滤 /api/ 之后的部分吗?
  • @BlackHoleGalaxy “过滤器”是什么意思?
  • 在我的示例中,仅检索路线的 /api/ 之后的部分:/document/info/Id
  • @BlackHoleGalaxy 你可以随时使用myRoute.Replace("/api", string.Empty) 作为快速破解。
【解决方案3】:

如果你想在 API 控制器上使用任何 HttpMethod 属性指定的原始路由模板,那么可以这样做:

var routeAttribute = Url.ActionContext.ActionDescriptor.EndpointMetadata.First(d => d is HttpMethodAttribute);
var routeTemplate = ((HttpMethodAttribute)routeAttribute).Template;

如果原来的路由属性是:[HttpGet("Self/{id}")]

routeTemplate 值为:"Self/{id}"

【讨论】:

    【解决方案4】:
    Url.ActionContext.ActionDescriptor.AttributeRouteInfo.Template
    
    "v{version}/{cardId}/cardsTest" {$1}
    

    【讨论】:

    • 在 .Net 5+ 中,为什么这不是正确的答案? Url.ActionContext.ActionDescriptor.AttributeRouteInfo.Template
    • 请解释您的代码。另外,您应该注意,这不是问题中所要求的。
    猜你喜欢
    • 2014-05-18
    • 2016-06-05
    • 2011-10-10
    • 1970-01-01
    • 2011-03-26
    • 2011-01-28
    • 2010-10-11
    • 2020-10-16
    相关资源
    最近更新 更多