13

別の質問をした後すぐにこれについて質問して申し訳ありませんが、私は現在PUTに苦労しています。

データを収集してvaluescontrollerのPUT関数に渡すjQueryメソッドがあります。しかし、コントローラーは呼び出されていません(ブレークポイントがあり、ブレークしていないため)

jQueryが正しいことを確認できますか?

var data = {
            id: truckId,
            obj: {
                TruckId: truckId,
                Reg: reg,
                Description: desc,
                Condition: condition
            }
        };
        var json = JSON.stringify(data)

        $.ajax({
            url: '/api/Values',
            type: 'PUT',
            contentType: "application/json; charset=utf-8",
            data: json,
            success: function (results) {
                $.getJSON("api/Values", LoadTrucks);
                alert('Truck Updated !');
            }
        })

コントローラは次のようになります。

public void Put(int id, TruckInfo obj)
    {
        WebApiTestEntities db = new WebApiTestEntities();

        var data = from item in db.TruckInfoes
                   where item.TruckId == id
                   select item;
        TruckInfo oldRecord = data.SingleOrDefault();
        oldRecord.Reg = obj.Reg;
        oldRecord.Description = obj.Description;
        oldRecord.Condition = obj.Condition;
        db.SaveChanges();
    }

今では、少なくともコントローラーに到達しているように見えます。私の推測では、パラメーターが正しく渡されていないため、別のメソッドを探していますが、それを修正する理由や方法がわかりません。

どんな助けでも大歓迎です:)

レックス

編集:要求に応じて、詳細情報。

エラーコンソールにJavascriptエラーはありません。

コンソールログには次の情報が表示されます。

{"メッセージ":"リクエストURI'localhost:62997 / api /Values'に一致するHTTPリソースが見つかりませんでした。"、 "MessageDetail":"リクエストに一致するコントローラー'値'にアクションが見つかりませんでした。"}

そして、JSONコンソールのMessageDetailの下でこれを取得します(これは、間違ったパラメーターに関する私の理論をサポートしていると思います)

「要求に一致するコントローラーの「値」にアクションが見つかりませんでした」

ただし、getは成功します。(そして、私が今朝早く仕事を始めたPOST。)

4

4 に答える 4

18

以下のようにコードを変更すると、正常に動作します。

var data = {
        TruckId: truckId,
        Reg: reg,
        Description: desc,
        Condition: condition
    };

var json = JSON.stringify(data)

$.ajax({
    url: '/api/Values/' + truckId,
    type: 'PUT',
    contentType: "application/json; charset=utf-8",
    data: json,
    success: function (results) {

    }
})

REST を使用する場合のベスト プラクティスは次のとおりです。

  1. 新しいリソースを作成するときのユーザー POST。
  2. ユーザーは既存のリソースを更新するときに PUT し、リソースの ID は URL に含める必要があります。
  3. ユーザーは既存のリソースを削除するときに DELETE を実行し、リソースの ID もクエリ文字列に含める必要があります。
于 2013-02-26T11:21:37.370 に答える
5

オブジェクトの ID を指定せずに PUT リクエストを実行しています。

ここを参照してください。

PUT リクエストの URI は、リクエストに含まれるエンティティを識別します

変化する

url: '/api/Values',
type: 'PUT',

url: '/api/Values/' + truckId,
type: 'PUT',

ルーティング エンジンはid、メソッドに一致する必要があります

public void Put(int id, TruckInfo obj)

現時点では、これをモデルに入れようとしています:

id: truckId,
obj: {
   TruckId: truckId,
   //etc

しかし、これはうまくいきません。リクエストのボディからデシリアライズできるオブジェクトは 1 つだけです。

メッセージペイロードをこれに変更するだけです

var data = {
            TruckId: truckId,
            Reg: reg,
            Description: desc,
            Condition: condition
           }

正しい URL 構造を使用します。例:

PUT http://localhost:62997/api/Values/1
于 2013-02-26T11:17:35.790 に答える
0

Firebugまたは同様のブラウザプラグインを使用して、行われたリクエストとサーバーからの応答を確認できます。

IISもPUT動詞を拒否している可能性があります。私は同じ問題に遭遇しました。この場合、ファイル内のこれらのハンドラーを変更または追加することで修正できるはずweb.configです(セクション<system.webServer>)。

<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
于 2013-02-26T11:19:17.417 に答える
0

次の構成を web.config ファイルに追加します

<system.webServer>
    <handlers>
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
于 2015-03-13T11:41:47.837 に答える