我想知道是否有可能以某种方式获得控制器之外的路由值?
这就是我试过的。我也试着做.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-Values-Values-0-0-Values-0
发布于 2014-07-10 05:50:08
WebApi有自己的嵌套RouteData,这是因为它没有在System.Web
中使用RouteData
类,而是使用了自己的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);
}
}
发布于 2015-05-22 17:24:34
注意此修复中使用的键不正确,在MS_DirectRouteMatches. 4.5中的“当前”键是.net
routeData.Values"MS_SubRoutes“应该是routeData.Values"MS_DirectRouteMatches")。
https://stackoverflow.com/questions/24665016
复制相似问题