Asp.net web api WebAPI OData路由:odataPath中的参数化前缀

Asp.net web api WebAPI OData路由:odataPath中的参数化前缀,asp.net-web-api,odata,Asp.net Web Api,Odata,对于WebAPI 2 OData解决方案,我们需要能够映射以下路由类型: ~/odata/1234erp/Products表示控制器(或Entityset)段的前缀是一个值。我的路线安排如下: config.Routes.MapODataRoute( routeName: "odata", routePrefix: "odata/{tableid}/{controller}", model: ModelBuilder.GetEdmMode

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

~/odata/1234erp/Products表示控制器(或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…

像这样去掉routePrefix的{controller}段:
“odata/{tableid}
似乎解决了这个问题。现在我可以像这样指向正确的控制器

    if (firstSegment != null && firstSegment is EntitySetPathSegment)
    {
        return firstSegment.ToString();
    }
在该控制器中,我可以获取tableid作为参数:
get(stringtableID)

更好的是

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

返回正确的EdmType…

虽然这样做有效,但我还没有弄清楚当我在控制器中时如何以类型安全的方式“提取”tableid。我可以这样做:
var tableid=ControllerContext.Request.RequestUri.Segments[2]。TrimEnd('/');
但这并不理想。是否要以类型安全的方式执行此操作?