45

MVC4 webapiベータ版をRCに更新してから、問題の解決策を求める以前の質問をいくつか行いました。今は一番順調ですが、理由がわからないものがあります。

この単純なコントローラーには、POSTを受け入れるものとGETを受け入れるものがあります。HTMLフォームからリクエストを送信してこれらを実行しようとすると、GETコントローラーのみが検出され、POSTコントローラーは次のエラーを返します。

{
  "Message": "No HTTP resource was found that matches the request URI 'http://localhost/webapi/api/play/test'.",
  "MessageDetail": "No action was found on the controller 'Play' that matches the name 'test'."
}

POSTコントローラーが見つからないのはなぜですか?

コントローラー

public class PlayController : ApiController
{
    [HttpPost]  // not found
    public string Test(string output)
    {
        return output;
    }

    [HttpGet]  // works
    public string Test2(string output)
    {
        return output;
    }
}

HTMLフォーム

<form action="http://localhost/webapi/api/play/test" method="post">
<input type="text" name="output" />
<input type="submit" name="submit" />
</form>

<form action="http://localhost/webapi/api/play/test2" method="get">
<input type="text" name="output" />
<input type="submit" name="submit" />
</form>
4

1 に答える 1

95

「単純な」値を投稿する場合、Web.API は少しうるさいです。

属性を使用し[FromBody]て、値が URL からではなく、投稿されたデータからのものであることを通知する必要があります。

[HttpPost]
public string Test([FromBody] string output)
{
    return output;
}

この変更により、404 を取得しなくなりますがoutput、常に null になります。これは、Web.Api が投稿された値を特別な形式で要求するためです(Singing Simple Types セクションを参照してください)。

次に、クライアントは次の形式で値を送信する必要があります。

=value

具体的には、名前と値のペアの名前部分は、単純型の場合は空にする必要があります。>すべてのブラウザーが HTML フォームでこれをサポートしているわけではありませんが、スクリプトでこの形式を作成します...

したがって、モデル タイプを作成することをお勧めします。

public class MyModel
{
    public string Output { get; set; }
}

[HttpPost]
public string Test(MyModel model)
{
    return model.Output;
}

次に、ビューを変更せずにサンプルの from で動作します。

于 2012-09-02T15:59:50.230 に答える