Веб-API и OData - передача нескольких параметров

Можно ли заставить OData делать следующее? Я хотел бы иметь возможность запросить вызов REST, передав параметры, которые могут не быть первичным ключом. Могу ли я вызвать такой метод REST -> GetReports(22, 2014) или Reports(22, 2014)?

[HttpGet]
[ODataRoute("Reports(Id={Id}, Year={Year})")]
public IHttpActionResult GetReports([FromODataUri]int Id, [FromODataUri]int Year)
{
    return Ok(_reportsRepository.GetReports(Id, Year));
}

Вот мое последнее изменение.

  //Unbound Action  OData v3
       var action = builder.Action("ListReports");
        action.Parameter<int>("key");
        action.Parameter<int>("year");
        action.ReturnsCollectionFromEntitySet<Report>("Reports");

мой метод для контроллера ReportsController

[HttpPost]
            [EnableQuery]
             public IHttpActionResult ListReports([FromODataUri] int key, ODataActionParameters parameters)

            {

                if (!ModelState.IsValid)
                {
                    throw new HttpResponseException(HttpStatusCode.BadRequest);
                }


                int year = (int)parameters["year"];
                return Ok(_reportsRepository.GetReports(key, year).Single());

            }

Я пробовал назвать этот URL следующим образом:

 http://localhost:6064/odata/Reports(key=5,year=2014)/ListReports

Ресурсов HTTP, соответствующих URI запроса "http://localhost:6064/odata/Reports(key%3D5%2Cyear%3D2014)/ListReports'", не обнаружено.


person Nate    schedule 07.07.2014    source источник


Ответы (2)


Вы можете определить функцию импорта с именем GetReports, которая имеет два параметра.

(Примечание: имя импорта функции не может совпадать с именем набора сущностей)

Сконфигурируйте свою модель EDM как:

var builder = new ODataConventionModelBuilder();
builder.EntitySet<Report>("Reports");
var function = builder.Function("GetReports");
function.Parameter<int>("Id");
function.Parameter<int>("Year");
function.ReturnsCollectionFromEntitySet<Report>("Reports");
var model = builder.GetEdmModel();

А затем напишите свой метод как:

[HttpGet]
[ODataRoute("GetReports(Id={Id},Year={Year})")]
public IHttpActionResult WhateverName([FromODataUri]int Id, [FromODataUri]int Year)
{
    return Ok(_reportsRepository.GetReports(Id, Year));
}

Тогда просьба

Get ~/GetReports(Id=22,Year=2014)

буду работать.

person Feng Zhao    schedule 09.07.2014
comment
Как это можно сделать с Odatav3? v3 не имеет функции. - person Nate; 10.07.2014
comment
Мне нужно использовать Odata v3, потому что я использую Jaydata, и, похоже, он работает только с v3. Если я использую Jaydata с Odata v4, возникает ошибка 404. Любое решение с v3? Спасибо - person Nate; 10.07.2014
comment
С v3 вы можете определить действие. Если вы определяете несвязанное действие, вы должны использовать HttpPost и передавать параметры через тело запроса, и вам нужно добавить метод HandleUnmappedRequest в контроллер, чтобы он соответствовал запросу несвязанного действия. Если вы определяете его как связанное действие, привязанное к набору сущностей, хотя это не имеет смысла, вы можете добавить метод [ActionName] OnCollectioinOf [EntityTypeName] и вызвать HttpPost ~ / [EntitySetName] / [ActionName] и передать параметры в тело запроса. - person Feng Zhao; 10.07.2014
comment
Спасибо, Фэн. У вас есть где-нибудь пример, на который я могу посмотреть? Есть какие-нибудь блоги, показывающие, как создать несвязанное действие? - person Nate; 10.07.2014
comment
На aspnet.codeplex.com/SourceControl/latest#Samples/ReadMe есть много примеров .txt Для примера действия v3 проверьте это aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/ - person Feng Zhao; 10.07.2014
comment
Спасибо, но этот пример не отменяет HandleUnmappedRequest, который, как вы указали, должен быть выполнен. Я не нашел четких примеров переопределения и использования HandleUnmappedRequest. Требуется ли переопределение HandleUnmappedRequest? - person Nate; 10.07.2014
comment
В этом примере используется другой способ маршрутизации несвязанного действия, заключающийся в добавлении соглашения о маршрутизации клиента NonBindableActionRoutingConvention для маршрутизации запроса несвязанного действия. Для HandleUnmappedRequest проверьте System.Web.Http.OData.Routing.RoutingCustomersController.HandleUnmappedRequest: aspnetwebstack.codeplex.com/SourceControl/latest#test/ - person Feng Zhao; 10.07.2014
comment
Я изменил метод на ListReports.error - не найден HTTP-ресурс, соответствующий URI запроса, подробности см. Выше. - person Nate; 10.07.2014
comment
Фэн, проблема с первым примером v3, с которым вы связались, заключается в том, что он не показывает, как вызвать действие SetDueDate из JavaScript, что, как я думаю, многие люди ищут, когда заходят в этот пост. - person Robert McLaws; 04.08.2014
comment
Можно ли реализовать параметры в методе get? Имя метода просто получилось бы и с ODataRoute. - person gee'K'iran; 02.09.2015

Для конечных точек OData v4.0 вам не нужно делать это функцией, вы можете просто сделать ...

public class ReportsController : ODataController
{
    [EnableQuery]
    [ODataRoute("Reports({id}, {year})")]
    public IQueryable<ReportModel> Get([FromODataUri] int id, [FromODataUri] int year)
    {
        ...
    }
}

Тогда вы можете назвать это как ...

/Reports(42, 2019)
person Jason Pelletier    schedule 17.10.2019