2012-08-08 23 views
13

ウェブAPIモデルASP.NETのWeb APIのルートを考える

次ApiControllerアクションメソッドにマップ
example/{Id} 

public void Example(Model m) 
{ 
    ... 
} 

モデルクラスでは次のように定義される。

public class Model 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

私はその後、URL /example/123に01のIdプロパティをJSON { "Name": "Testing" }を投稿しますオブジェクトはバインドされていません。どのように私は、モデルバインディングも、経路データから値を含めることができます0の代わりに

123のように、それは残りますか?私は、一般的なユースケースのように見えるカスタムモデルのバインダーを書く必要がない方がいいです。どんなアイデアでも大歓迎です。ありがとう!このため

答えて

3

提案プロセスは、/example代わりの/example/{id}に投稿することは通常です。 http://stephenwalther.com/archive/2012/03/05/introduction-to-the-asp-net-web-api.aspx

+0

私はリソースをPUTingていますか?その場合、私はURLからIDを削除したくありません。 –

+2

その場合、 '(int id、Model、model)'アクションで別のパラメータとして指定する必要があります。私が知っている最良の解決策ではありません。 – dkarzon

0
から http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

はまた、「ASP.NETのWeb APIでレコードを挿入する」でこのリンクをチェックしてください。このページの下

チェックアウトテーブル半分(Web APIを持つものの、彼らは通常/api/{controller}を使用します)

私はデフォルトのバインダーがあなたのIdルートの値をあなたのModel Idプロパティに関連付けることはできないと思っています。だからd1k_isの答えはどんなものでも得意です。どちらかそれか、あなた自身のバインダー(あなたは多分、より汎用的なバインダーを書くことができるかもしれません?あなたはDomainEntityスーパークラスまたはそのような何かのように持って-if ...)

10

あなたが探しているものを実現する最も簡単な方法は、あなたの方法に別のパラメータを追加し、要求のどの部分から来て、どのパラメータを指定するだけです。

例:

[HttpPost] 
public void Example([FromUri]int id, [FromBody]Model m) { 
    // ... 
} 

/examples/{id}のあなたのルートが正常にバインドすることができます - Example方法は、それがURIに探しているidというパラメータを持っているので。あなたのモデルを移入するには、あなたにもそこにIDを渡すか、以下のような何かを行うことができ、次のいずれか

[HttpPost] 
public void Example([FromUri]int id, [FromBody]Model m) { 
    m.Id = id; // Make sure the model gets the ID as well. 
} 

あなたは上記のように、単に/example/123{ "Name": "Testing" }に投稿してください。

関連する問題