web-dev-qa-db-ja.com

Web Apiへの簡単な投稿

Web APIを使用するための投稿リクエストを取得しようとしています。以下は私のAPIコントローラーです。

public class WebsController : ApiController
{
    [HttpPost]
    public void PostOne(string id)
    {
    }

    [HttpPost]
    public void PostTwo(Temp id)
    {
    }
}

アクションを考慮に入れるためにwebapiルートを変更しました。 Tempモデルは次のようになります。

public class Temp
{
    public string Id { get; set; }
}

私の見方はこんな感じ

@using (Ajax.BeginForm(new AjaxOptions
{
    Url = "/api/webs/postone",
    HttpMethod = "post"
}))
{
    <input name="id" id="id" value="2" />
    <input type="submit" value="submit" />
}

上記のコードは、このようにパラメーターの前に[FromBody]属性を配置しない限り、postoneではまったく機能しません。

[HttpPost]
public void PostOne([FromBody]string id)
{
}

その後、アクションにヒットしますが、IDはまだnullです。テキストボックスの値は入力されません。

しかし、モデルUrlを取るAjax.BeginFormposttwoTempに変更すると、うまく機能し、Idフィールドがテキストボックスで適切な値を取得します。

誰も私にこれが起こる理由と簡単な値をWeb APIアクションに投稿する方法を説明してもらえますか?つまり、単純な型ではなく複雑な型をバインドできるのはなぜですか。

68
Amila

この質問をしてからかなり時間が経ちました。今、私はそれをより明確に理解しました。他の人を助けるために、より完全な答えを出します。

Web APIでは、パラメーターバインドがどのように行われているかを覚えるのは非常に簡単です。

  • POST単純型の場合、Web APIはURLからそれをバインドしようとします
  • POST複合型の場合、Web APIは要求の本体からのバインドを試みます(これはmedia-typeフォーマッターを使用します)。

  • URLから複合型をバインドする場合は、アクションパラメーターで[FromUri]を使用します。これの制限は、データがどれだけ長くなるか、URL文字の制限を超える場合です。

    public IHttpActionResult Put([FromUri] ViewModel data) { ... }

  • リクエスト本文から単純型をバインドする場合は、アクションパラメーターで[FromBody]を使用します。

    public IHttpActionResult Put([FromBody] string name) { ... }

補足として、何かを更新するためにPUT要求(単なる文字列)を作成しているとしましょう。 URLに追加せず、モデル内のプロパティが1つだけの複合型として渡す場合、jQuery ajaxのdataパラメーターは次のようになります。データパラメーターに渡すオブジェクトには、プロパティ名が空のプロパティが1つしかありません。

var myName = 'ABC';
$.ajax({url:.., data: {'': myName}});

web APIアクションは次のようになります。

public IHttpActionResult Put([FromBody] string name){ ... }

このasp.netページですべてを説明しています。 http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

107
Amila