Пользовательские соглашения о маршрутизации OData на разных контроллерах - PullRequest
2 голосов
/ 24 апреля 2020

Я получил несколько примеров соглашений о маршрутизации от

https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/odata-routing-conventions.

В этом примере я могу получить свойства объекта, используя этот запрос /odata/Products(1)/Suppliers

Я хочу поместить два параметра в Продукты. Например /odata/Products(1,2)/Suppliers Как мне это настроить?

Вот класс CustomRoutingConvention:

public class NavigationIndexRoutingConvention : EntitySetRoutingConvention
{
    public override string SelectAction(ODataPath odataPath, HttpControllerContext context, 
        ILookup<string, HttpActionDescriptor> actionMap)
    {
        if (context.Request.Method == HttpMethod.Get && 
            odataPath.PathTemplate == "~/entityset/key/navigation/key")
        {
            NavigationPathSegment navigationSegment = odataPath.Segments[2] as NavigationPathSegment;
            IEdmNavigationProperty navigationProperty = navigationSegment.NavigationProperty.Partner;
            IEdmEntityType declaringType = navigationProperty.DeclaringType as IEdmEntityType;

            string actionName = "Get" + declaringType.Name;
            if (actionMap.Contains(actionName))
            {
                // Add keys to route data, so they will bind to action parameters.
                KeyValuePathSegment keyValueSegment = odataPath.Segments[1] as KeyValuePathSegment;
                context.RouteData.Values[ODataRouteConstants.Key] = keyValueSegment.Value;

                KeyValuePathSegment relatedKeySegment = odataPath.Segments[3] as KeyValuePathSegment;
                context.RouteData.Values[ODataRouteConstants.RelatedKey] = relatedKeySegment.Value;

                return actionName;
            }
        }
        // Not a match.
        return null;
    }
}

Класс конфигурации веб-API:

 public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
        // Create EDM (not shown).

        // Create the default collection of built-in conventions.
        var conventions = ODataRoutingConventions.CreateDefault();
        // Insert the custom convention at the start of the collection.
        conventions.Insert(0, new NavigationIndexRoutingConvention());

        config.Routes.MapODataRoute(routeName: "ODataRoute",
            routePrefix: "odata",
            model: modelBuilder.GetEdmModel(),
            pathHandler: new DefaultODataPathHandler(),
            routingConventions: conventions);

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...