web-dev-qa-db-ja.com

ASP.NET MVCのWebApi [FromUri]とは何ですか?

WebApiでは、コントローラーアクションのパラメーターを[FromUri]で修飾して、URIのコンポーネントをPOCOモデルに「デシリアライズ」することができます。別名モデルバインディング。

2.0からMVCを使用していますが、WebサイトでMVCを使用したことはありません(理由は不明です)。 ASP.NET MVC 5でこれに相当するものは何ですか?

ライブラリを参照する必要がない限り、属性はIDEで認識されないようです。

以下のモデルに~/thing/2014/9をバインドしてください。

public class WhateverModel
{
    public int Year { get; set; }
    public int Month { get; set; }
}

ありがとう

更新

他の質問(上記のリンク)では、OPは次のよ​​うに述べています。

ただし、これをWebApiではなくプレーンMVCに切り替えると、デフォルトのモデルバインダーが機能しなくなり、ネストされた配列内のオブジェクトのプロパティをバインドできなくなります

これは、彼がWebApiの属性を使用していることを意味します。私は推測する。私はMVCにいるので、これらの参照はありません。MVCでこれを行うには、Webabiのバージョンを(ab)使用する方法が受け入れられますか?

アップデート2

その質問への答えは:

MVCモデルバインダーの命名規則に従ってクエリ文字列を作成する必要があります。

さらに、サンプルアクションの[FromUri]属性はMVC DefaultModelBinderに認識されていないため、完全に無視されます。

そのため、OPが間違った属性である程度の成功を収めていた場合、OPがその質問で何を話していたのかわからないままです。

私は明確な答えを望んでいると思いますが、他の質問の泥ではありません。

22
Luke Puplett

それだけで動作します™:

[HttpGet]
public ActionResult Thing(WhateverModel model)
{
    // use model
    return View();
}

少なくとも、URL /thing?Year=2014&Month=9を使用する場合。

問題はルーティングです。 URL /thing/2014/9はMVCのデフォルトルートを使用してマッピングされません。これは/{controller}/{action}/{id}であり、{id}はオプションのintであるためです。

最も簡単なのは、属性ルーティングを使用することです。

[HttpGet]
[Route("/thing/{Year}/{Month}"]
public ActionResult Thing(WhateverModel model)
{
    // use model
    return View();
}

これにより、モデルにURLがマップされます。

30
CodeCaster