WebAPI OData路由:odataPath中的参数化前缀

时间:2013-11-19 09:28:21

标签: asp.net-web-api odata

对于WebAPI 2 OData解决方案,我们需要能够映射以下路由类型:

〜/ odata / 1234erp / Products 表示Controller(或Entityset)段的前缀值。我的路线设置如下:

    config.Routes.MapODataRoute(
        routeName: "odata",
        routePrefix: "odata/{tableid}/{controller}", 
        model: ModelBuilder.GetEdmModel(), 
        pathHandler: new DefaultODataPathHandler(),
        routingConventions: conventions);

这使我的CustomControllerRoutingConvention中的SelectAction方法被命中(SelectController没有被命中)但odataPath参数计数0段,我希望它能识别像〜/ tableid / entityset /

现在我可以用

之类的东西来解决这个问题
controllerContext.RequestContext.RouteData.Values["tableid"]

但是有更好的(类型更好?)解决方案吗?

编辑: 此外,由于ODataPath path = Request.GetODataPath()返回0个段,因此不再可能为ODataQueryOptions派生EdmType需要...

1 个答案:

答案 0 :(得分:1)

取消routePrefix的{controller}段,如下所示:"odata/{tableid} 似乎解决了这个问题。现在我可以像这样直接找到正确的控制器

    if (firstSegment != null && firstSegment is EntitySetPathSegment)
    {
        return firstSegment.ToString();
    }

在该控制器中,我可以将tableid作为参数:Get(string tableid)

更好的是,

ODataPath path = Request.GetODataPath();
IEdmType edmType = path.EdmType;

返回正确的EdmType ...