5

ApiController がアクションのデフォルト パラメータ値を「通常の」コントローラとは異なる方法で処理する理由に興味があります。

このコードは問題なく動作します。/Test へのリクエストは、ページが値 1 を取得することを意味します

public class TestController : Controller
{
    public ActionResult Index(int page = 1)
    {
        return View(page);
    }
}

/api/Values に対してリクエストが行われた場合、このコードは機能しません。次のエラーで失敗します。

「パラメーター ディクショナリには、'MvcApplication1.Controllers のメソッド 'System.Collections.Generic.IEnumerable`1[System.String] Get(Int32)' の null 非許容型 'System.Int32' のパラメーター 'page' の null エントリが含まれています。 .Controllers.ValuesController'. オプションのパラメーターは、参照型または null 許容型であるか、オプションのパラメーターとして宣言する必要があります。"

public class ValuesController : ApiController
{
    public IEnumerable<string> Get(int page = 1)
    {
        return new string[] { page.ToString() };
    }      
}

これがなぜなのかについてのヒントはありますか?

4

2 に答える 2

5

[FromUri] または [FromForm] パラメータ属性を追加してみてください。

public class ValuesController : ApiController
{
    public IEnumerable<string> Get([FromUri]int page = 1)
    {
        return new string[] { page.ToString() };
    }      
}

Mike Stall は、ASP MVC のように機能しない Webapi のパラメーター バインドに関する 2 つの優れた投稿をしています。慣れる必要がある大きな問題は、パイプラインで一度しかリクエスト本文を読み取れないことです。したがって、複数の複雑なオブジェクトをパラメーターとして読み取る必要がある場合は、パラメーターによる ModelBinding に頼る必要があります。ロギング目的でパイプラインの早い段階でコンテンツ本文を読んでいたときに、あなたと同様の問題があり、上記の読み取り 1 回の制限について認識せず、独自のカスタム モデル バインダーで解決する必要がありました。

http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspxでモデル バインディングについて説明し、WebAPI モデル バインディングを ASP のようにする方法を提案します。 MVC http://blogs.msdn.com/b/jmstall/archive/2012/04/18/mvc-style-parameter-binding-for-webapi.aspx

于 2012-04-20T01:40:43.367 に答える
0

として定義してみてくださいNullable<T>

public class ValuesController : ApiController
{
    public IEnumerable<string> Get(int? page = 1)
    {
        return new string[] { page.ToString() };
    }      
}
于 2012-04-19T19:02:44.610 に答える