5

ASP.NET MVC 4 RC Web API の奇妙なバインドの問題と思われるものを取得しています。クライアントからの投稿リクエストを受け入れるためのメソッドがあります。問題は、post メソッドが呼び出されたときにどのパラメーターもバインドされていないことです。throw 行と名前のブレークポイントに到達し、電子メールは両方とも null です。JavaScript でリクエストのタイプを GET に変更すると、以下の Get 関数がパラメータをバインドして呼び出されます。

パラメータが Post メソッドのバインドに失敗するのはなぜですか? また、これを修正するにはどうすればよいですか?

send: function(evt) {
    evt.preventDefault();
    $.ajax( {
        url: '/api/person',
        data: this.model.toJSON(),
        type: "POST",
        dataType: "json",
        success: function(data) {
            console.log("Success");
        },
        error: function(data) {
            console.log("Error");
        }
    });
     }

コントローラーのアクションは次のとおりです。

public void Get(string name, string email) {
    throw new NotImplementedException();
}

public void Post(string name, string email) {
    throw new NotImplementedException();
}

ノート:

  • ASP.NET MVC 4 RC Web API のすべてのデフォルトを使用しています (したがって、デシリアライザーは Json.NET である必要があります)。
  • JS デバッガーの Chrome ネットワーク タブは、投稿時にフォーム データのパラメーターを正しく表示します。
4

1 に答える 1

13

MVC (Web ページ) とは異なり、単純なパラメーターの型は、既定では、投稿の本文からではなく URI からバインドされます。したがって、コードをそのまま使用すると、クエリ文字列またはルート パラメーターとしてパラメーターnameとパラメーターを渡す必要があります。email

ただし、これは (MVC 言語で) モデル タイプを作成し、それをメソッド パラメーターに使用することで簡単に解決できます。[FromUri]実際、 get メソッドで使用すると、両方に使用できます(指定した場合) 。

public class SomeParams {
  public string name { get; set; }
  public string email { get; set; }
}

//now an alternative way to write the Get method
public MyResult Get([FromUri] SomeParams p){
  //members are bound from the query string (more like MVC traditional binding)
  //note - as in MVC, SomeParams will need a default constructor for this to work.
}

public PostResult Post(SomeParams p){
  //'p' is bound from your JSON (assuming correct format)
  //because 'complex' types are deserialized using formatters
  //only one object can be read from the body with a formatter in Web API
  //as the request body is not buffered; unlike MVC.
}

メソッドが何かを返す必要があるという理由だけで、メソッドの戻り値の型に固執しました!

上記でリンクしている Mike Stall の記事 (および彼の他の多くの記事) を読むことを強くお勧めします。

Web API は MVC と同じパラダイムやクラス名を共有しているため、実際には MVC と同じであると思いがちですが、そうではありません。私は当初、なぜそうなのか疑問に思いました (私自身、MVC の上に多数の REST サービスを作成しており、いくつかのユーティリティ クラスと基本クラスの拡張機能を作成すると、非常にクールであることがわかりました)。彼らは Web API を作成する際の課題を適切に検討しており、彼らのアプローチに変更を加えたのはおそらく正しいと思います。

ただし、これは、今では当然のことと考えているいくつかのことを Web API 用に再学習する必要があることを意味します。

于 2012-06-22T15:17:12.163 に答える