是否可以在控制器外部的运行时获取路径数据?

Sta*_*tan 2 c# asp.net asp.net-mvc asp.net-mvc-routing

我想知道是否有可能以某种方式获得控制器之外的路由值?

这就是我尝试过的.我也试过,.Values["{projectId}"];但我还是得到了null.

[RoutePrefix("projects")]
public class UsergroupController : ApiController
{
    [Route("{projectId}/usergroups"), HttpGet]
    public IHttpActionResult Get()
    {
        // Url: /projects/123/usergroups
        // Response: null
        var projectId = HttpContext.Current.Request.RequestContext.RouteData.Values["projectId"];
        return Ok(projectId);
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现它位于,但是在一个非常奇怪的问题.也许可能有某种LINQ查询来获取它?

的RouteData值值-0-0值0

在此输入图像描述

Xen*_*ing 8

WebApi拥有自己的嵌套RouteData,这是因为它不使用RouteData类,System.Web而是它自己的HttpRouteData类.

WebApi路由在密钥下添加一个条目MS_SubRoutes,WebApi将其用于其内部路由.

我编写了一个扩展方法,将WebApi路由数据展平为string/object字典,这是您可能会看到的RouteData.Values

WebApiExtensions.cs

public static class WebApiExtensions
{
    public static IDictionary<string, object> GetWebApiRouteData(this RouteData routeData)
    {
        if (!routeData.Values.ContainsKey("MS_SubRoutes"))
            return new Dictionary<string,object>();

        return ((IHttpRouteData[])routeData.Values["MS_SubRoutes"]).SelectMany(x => x.Values).ToDictionary(x => x.Key, y => y.Value);
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

[RoutePrefix("projects")]
public class UsergroupController : ApiController
{
    [Route("{projectId}/usergroups"), HttpGet]
    public IHttpActionResult Get()
    {
        // Url: /projects/123/usergroups
        // Response: null
        object value = null;

        var webApiRouteData = HttpContext.Current.Request.RequestContext.RouteData.GetWebApiRouteData();
        value = webApiRouteData["projectId"];

        return Ok(value);
    }
}
Run Code Online (Sandbox Code Playgroud)