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

时间:2014-07-09 23:02:45

标签: 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);
    }
}

我发现它位于,但是非常奇怪。也许可能会有某种LINQ查询来获取它?

的RouteData值值-0-0-值-0

enter image description here

2 个答案:

答案 0 :(得分:7)

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);
    }
}

<强>用法:

[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);
    }
}

答案 1 :(得分:0)

请注意,此修复程序中使用的密钥不正确,“当前”在.net 4.5中,密钥为 MS_DirectRouteMatches

routeData.Values [“MS_SubRoutes”]应为routeData.Values [“MS_DirectRouteMatches”])。