web-dev-qa-db-ja.com

コントローラのアクションのパステンプレートが有効なODataパステンプレートではありません

次のエラーが発生します。

コントローラ「Clients」のアクション「GetClients」のパステンプレート「GetClients()」は、有効なODataパステンプレートではありません。セグメント「GetClients」のリソースが見つかりません。

私のコントローラーメソッドは次のようになります

public class ClientsController : ODataController
{
    [HttpGet]
    [ODataRoute("GetClients(Id={Id})")]
    public IHttpActionResult GetClients([FromODataUri] int Id)
    {
        return Ok(_clientsRepository.GetClients(Id));
    }
}

私のWebAPIConfigファイルには

builder.EntityType<ClientModel>().Collection
       .Function("GetClients")
       .Returns<IQueryable<ClientModel>>()
       .Parameter<int>("Id");

config.MapODataServiceRoute(
    routeName: "ODataRoute",
    routePrefix: "odata",
    model: builder.GetEdmModel());

私は次のようにodatarestapiを呼び出すことができることを望んでいます:

http://localhost/odata/GetClients(Id=5)

私が間違っていることについて何か考えはありますか?

11
Nate

エンティティを取得するためにそのような関数を追加する必要はありません。

builder.EntitySet<ClientModel>("Clients")

は、あなたが必要とすることすべてです。

そして、あなたの行動を次のように書いてください:

public IHttpActionResult GetClientModel([FromODataUri] int key)
{    
      return Ok(_clientsRepository.GetClients(key).Single());
}

または

これがうまくいったことです。上記は機能しませんでした:

public IHttpActionResult Get([FromODataUri] int key)
{    
    return Ok(_clientsRepository.GetClients(key).Single());
}

次に、Getリクエスト

http://localhost/odata/Clients(Id=5)

または

http://localhost/odata/Clients(5)

働くでしょう。

更新:バインドされていない関数を使用して、多くのClientModelを返します。

次のコードはv4用です。 v3の場合、アクションを使用できます。

builder.EntitySet<ClientModel>("Clients");
var function = builder.Function("FunctionName");
function.Parameter<int>("Id");
function.ReturnsCollectionFromEntitySet<ClientModel>("Clients");

次のようなメソッドをコントローラーに追加します。

[HttpGet]
[ODataRoute("FunctionName(Id={id})")]
public IHttpActionResult WhateverName(int id)
{
    return Ok(_clientsRepository.GetClients(id));
}

次のようなリクエストを送信します。

GET ~/FunctionName(Id=5)
11
Feng Zhao