2016-06-21 6 views
0

thisによると:パラメータが「シンプル」タイプであるWebAPIのルーティング:だから、単一の文字列パラメータ

  • 場合は、ウェブAPIは、URIから値 を取得しようとします。単純な型には、.NETプリミティブ型(int、 bool、doubleなど)、TimeSpan、DateTime、Guid、10進数、 および文字列、および から文字列に変換できる型変換器を持つ型が含まれます。複合型の場合、Web APIは、メディアタイプの フォーマッタを使用して、メッセージ本文から値を読み取ろうとします。

私は、ユーザの入力からのシングルstringパラメータを持つPOST作用を有し、したがって、任意の文字することができます - など外国人、ユニコード、アポストロフィ、「%20」何でも!

私はこのパラメータをURLに含めることを嫌っており、[FromBody]デコレータは役に立たないようです。質問は:WebAPIコントローラに単一の文字列パラメータを送信するための最良のもの[a-hem]

のC#:

[HttpPost] 
[Route("api/add")] 
public void Add([FromBody]string name) 
{ 
    // name is null :(
} 

JS:

function add(name: string) { 
    return this.$http.post("api/add/", name); 
} 

enter image description here

+0

'[FromBody]'属性がないからです。私はリクエストボディに私の価値を送った。そして、それは動作します。それが生成するリクエストを確認できますか? (ブラウザーまたはフィドラーで) – MaKCbIMKo

+0

文字列の値の前後に引用符がないのでちょっとばかげています! – Tsar

+0

あなたのイメージの '/ localhost/**** /'のすべてのインスタンスをブロックしていませんでした:p – Brandon

答えて

0

私は `angular.toJsonを使用して、引用符で囲まれたリクエスト・オブジェクト(名前)をラップすることにより、これを解決している:私はちょうどポスト要求によって、単純な文字列を送信しようとした

function add(name: string) { 
    return this.$http.post("api/add/", angular.toJson(name)); 
} 
1

あなたが本当に[FromBody]デコレータをしたい場合は、そのモデルバインダーがポストされたデータを読み取ることができるので、あなたはDTOを作成することを検討すべきですこのDTOオブジェクトにマップします。

public class MyRequest 
{ 
    public string Name { set;get;} 
} 

[HttpPost] 
[Route("api/add")] 
public void Add([FromBody]MyRequest model) 
{ 
    //do something with model.Name 
} 

クラスを作成することを好むしていない場合、あなたのアクションメソッドから[FromBody]デコレータを削除し、文字列型を維持し、クエリ文字列として値を送信することができます。

public void Add(string model) 
{ 
    //do something with model.Name 
} 

$http.post('/api/add?name=Scott with a space') 
    .then(function(response) { 
     console.log('angular http response', response.data); 
    }) 
+0

これはまさに私がやっていたものです – Tsar

+0

一度ペイントして(例えば、ジェネリックな 'MyStringParameter'オブジェクトを作成して)、それをあなたが望む数のAPIメソッドに使用します。 – Brandon

+0

いいえ、問題は解決しました – Tsar

関連する問題