我想知道是否有可能以某种方式获得控制器之外的路线值?
这是我尝试过的。我也试过.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
答案 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”])。