获取当前操作的完整路径
Posted
技术标签:
【中文标题】获取当前操作的完整路径【英文标题】: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 设置为可选。 好的,问题已编辑。 【参考方案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
"vversion/cardId/cardsTest" $1
【讨论】:
在 .Net 5+ 中,为什么这不是正确的答案? Url.ActionContext.ActionDescriptor.AttributeRouteInfo.Template 请解释您的代码。另外,您应该注意,这不是问题中所要求的。以上是关于获取当前操作的完整路径的主要内容,如果未能解决你的问题,请参考以下文章