1

複数の GET アクションを持つ ApiController があります。問題は、名前の先頭に「Get」を付けずにアクションに名前を付けたくないことです。

たとえば、「GetImage」という名前のアクションを作成すると、問題なく動作します。「UpdateImage」という名前を付けると、アクション名の先頭に明示的な「Get」が必要になるため、アクションは呼び出されません。

使用したいアクションごとに異なるルートを定義することで解決できますが、それを達成するためのより簡単な方法があるはずです。

[HttpGet] 属性も試しましたが、残念ながらうまくいきませんでした。

私のルート設定:

    routes.MapHttpRoute(
        name: "ImagesApi",
        routeTemplate: "api/images/{action}/{id}",
        defaults: new { controller = "ImageStorageManager",id = RouteParameter.Optional }
    );

api/images/GetImageまたはでアクセスしていますapi/images/UpdateImage

4

2 に答える 2

6

単一のオブジェクト用ではないAPIコントローラーを作成してきた方法が役立つ場合があります。PluralSight での John Papa の SPA トークからアプローチを得ました (単一ページ アプリケーションを学習する場合は、これを強くお勧めします)。また、モジュールの 1 つでこれについて説明します。

2つの部分があります。

パート 1、ルートを設定して 2 つの通常のシナリオを実行し、必要に応じて 3 つ目を追加しました。

// ex: api/persons
routes.MapHttpRoute(
            name: ControllerOnly,
            routeTemplate: "api/{controller}"
        );// ex: api/sessionbriefs

//  ex: api/persons/1
routes.MapHttpRoute(
            name: ControllerAndId,
            routeTemplate: "api/{controller}/{id}",
            defaults: null, //defaults: new { id = RouteParameter.Optional } //,
            constraints: new { id = @"^\d+$" } // id must be all digits
        );

// ex: api/lookups/all
// ex: api/lookups/rooms
routes.MapHttpRoute(
            name: ControllerAction,
            routeTemplate: "api/{controller}/{action}"
        );

パート 2、ルックアップ コントローラー (ジョン パパの場合) で、メソッドに ActionName 属性を追加します。

    // GET: api/lookups/rooms
    [ActionName("rooms")]
    public IEnumerable<Room> GetRooms()
    {
        return Uow.Rooms.GetAll().OrderBy(r => r.Name);
    }

    // GET: api/lookups/timeslots
    [ActionName("timeslots")]
    public IEnumerable<TimeSlot> GetTimeSlots()
    {
        return Uow.TimeSlots.GetAll().OrderBy(ts => ts.Start);
    }
于 2012-12-15T14:01:44.840 に答える