2

パラメータの 1 つをパイプで区切られた文字列として渡せるようにすることで、複数の予約を作成できるように、API コントローラの 1 つを変更しようとしました。メソッドとクラスは次の場所で確認できます。

public class ReservationsController : ApiController
{
    public HttpResponseMessage PostReservation(string eRaiderUserName, string SpaceNumbers)
    {
        char[] delimiter = { '|' };
        string[] spaces = SpaceNumbers.Split(delimiter);
        bool saved = true;
        foreach(string space in spaces)
        {
            var reservation = new Reservation { eRaiderUserName=eRaiderUserName, SpaceNumber=Convert.ToInt32(space) };
            if (true)
            {
                reservation.Game = db.Games.FirstOrDefault(g => g.ID == AppSettings.CurrentGameID);
                db.Reservations.Add(reservation);
                db.SaveChanges();

                //HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, reservation);
                //response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = reservation.ID }));
                //return response;
            }
            else
            {
                saved = false;
                //return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
            }
        }

        db.SaveChanges();
        if (saved)
        {
            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created);
            response.Headers.Location = new Uri(Url.Link("DefaultApi", new { id = 1 }));
            return response;
        } else
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
        }
    }
}

正しい情報であると思われるものを投稿するフォームがありますが、次のエラーが発生し続けます。

{"$id":"1","Message":"No HTTP resource was found that matches the request URI 'http://localhost:58463/api/Reservations'.","MessageDetail":"No action was found on the controller 'Reservations' that matches the request."}

API の (変更された) save メソッドは、間違いなくまだ進行中の作業です。しかし、これが Web API コントローラーを見つけるのを妨げているのは何ですか? ファイアバグの出力は次のとおりです。

ここに画像の説明を入力

4

3 に答える 3

6

指摘したように、問題は、POST アクションが本文に投稿されたデータを単一のオブジェクトにしか転送できないことです (技術的な理由により)。

つまり、ルート データ、クエリ文字列、本文からデータを取得できますが、次の制限があります。

  • クエリ文字列またはルート データからのデータは、任意の数の単一の値でなければなりません (つまり、クラスにすることはできません)。
  • リクエストボディからのデータを含むアクションのパラメーターは 1 つしか持てませんが、これは複雑なクラスになる可能性があります
  • これを任意に組み合わせることができます。つまり、本体からの単一または複雑なパラメーターと、ルート データまたはクエリ文字列からの任意の数の単一パラメーターを作成できます。

したがって、問題を解決する最も一般的な方法 (つまり、このケースよりもさらに複雑な複雑なデータを渡す必要がある他のクラスに簡単に適用できます) は次のとおりです。

まず、あなたの場合、必要なすべてのデータのプロパティを持つクラスを作成します。

public class ReservationData
{
  public string eRaiderUserName { get; set; }
  public string SpaceNumbers  { get; set; }
}

次に、このクラスをアクションで受け取ったパラメーターの型として使用します。

public HttpResponseMessage PostReservation(ReservationData reservationData)

このコードを使用すると、フォーマッターは要求本文内のすべてのデータをアクション内の 1 つのパラメーターにマップできます。jQuery によって生成されたものと同様に、JSON または formdata 形式を使用できます。

注: プロパティ名は、ポストされたパラメーターの名前と大文字と小文字を区別して一致する必要があります。

于 2014-07-16T13:47:58.993 に答える
0

Web API では、POST フォーム変数を Web API メソッドの単純なパラメーターにマップするためのサポートが制限されています。Web API は投稿された複数のコンテンツ値を処理しません。Web API アクション メソッドに投稿できるコンテンツ値は 1 つだけです。

public HttpResponseMessage PostReservation(string eRaiderUserName, string SpaceNumbers)

{ //...}

jQueryを使用して呼び出そうとしています:

$.ajax({  url: 'api/reservations', type: 'POST', data: { ... }, dataType: 'json', success: function (data) {alert(data);} }); 

残念ながら、Web API はこの要求を処理できないため、エラーが発生します。ただし、クエリ文字列を使用してパラメーターを渡すと、次のように機能します。

$.ajax({ url: 'api/reservations?eRaiderUserName=2012&SpaceNumbers=test', type: 'POST', dataType: 'json', success: function (data) { alert(data); } });

しかし、それは良い解決策ではなく、複雑なオブジェクトには適用できません。そこで、さまざまな方法をご紹介します。

  1. モデル バインディングの使用 (推奨)
  2. カスタム パラメータ バインドの使用
  3. FormDataCollection
  4. クエリ文字列
于 2014-07-16T10:06:50.213 に答える