2

バックグラウンド

MVC 4 Web APIプロジェクト(ASP.NET)を使用してC#でAPIレイヤーをコーディングしています。

私はコントローラーで次のようなテストアクションを作成しました。

[System.Web.Mvc.HttpPost]
public string TestAction(FormCollection fc)
{
    return "test";
}

フォームの投稿をテストするためにFireFoxのPosterを使用しています。

  • content-typeはapplication/x-www-form-urlencodedに設定されています
  • パラメータの本文はfoo=bar&bar=fooに設定されます

これが私のルートです:

RouteTable.Routes.MapHttpRoute("PostDefault", "{controller}/{action}");

質問

PosterからURLとパラメーターを投稿するときに問題なくコントローラーをヒットできますが、ブレークポイントを設定してから渡されたものreturn "test";にカーソルを合わせるとFormCollection、(fc)ではなく空の文字列配列が渡されたことを示しています私の値(例string[0])。

$.post()私はクライアントでjQueryを使用してこれを何度も実行しましたが、フォームコレクションの受信に問題はありませんでした。

この場合、何が失敗しますか?

ありがとう、

マット

4

1 に答える 1

8

これはAPIコントローラー(ApiController)内で定義されたアクションのようです。この場合、は使用できませんFormCollection。これは、APIコントローラーではなく、通常のコントローラーアクションに使用されます(個人的には、通常のコントローラーアクションでも使用しませんが、それは別のトピックです。代わりに使用しているものを理解するには、次の段落を参照してください)。

ビューモデルを定義する必要があります。

public class MyViewModel
{
    public string Foo { get; set; }
    public string Bar { get; set; }
}

次に、コントローラーアクションにこのビューモデルをパラメーターとして使用させます。

public class TestController: ApiController
{
    [System.Web.Http.HttpPost]
    public string TestAction(MyViewModel model)
    {
        return "test";
    }
}

APIコントローラーの正しい属性は、コードの属性では[System.Web.Http.HttpPost]なく、であることに注意してください。[System.Web.Mvc.HttpPost]

また、RESTfulな規則に従うことをお勧めします。

RouteTable.Routes.MapHttpRoute("PostDefault", "{controller}");

その後:

public class TestController: ApiController
{
    public string Post(MyViewModel model)
    {
        return "test";
    }
}

ここで、HTTP動詞(この場合はPOST)が、呼び出されるコントローラーアクションを決定します。

POST /test
Server: http://example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
Connection: close

foo=bar&bar=foo
于 2012-10-18T16:43:04.543 に答える