2017-09-28 21 views
0

私は以下のナンシーモジュールを持っています。NancyのJSONリクエスト本体を文字列プリミティブ変数にバインドする方法は?

public class MyFooTestModule : NancyModule 
{ 
    public MyFooTestModule() 
    { 
     Post["/text"] = _ => 
     { 
      //string myNewText = this.Bind<string>(); // Fails, because string has no parameterless constructor 
      string myNewText = Request.Body.AsString(); 

      return Response.AsJson(myNewText); 
     }; 
    } 
} 

ここで、変数stringにバインドします。私が代わりにRequest.Body.AsString()を使用する場合は

System.MissingMethodException: No parameterless constructor defined for this object. 

、文字のエスケープが正しく動作していないと私は複数で終わる:私は例えばthis.Bind<int>()を使用すると、実行時に、私は私に言った例外を取得するので、しかし、私は、this.Bind<string>()を使用することはできません私の変数の引用符とエスケープされたバックスラッシュ。私は、クライアントからJavaScriptの文字列

"Hello\r\nWorld Foo!" 

を投稿するときより正確

は、私は、サーバーからのエコーJavaScriptの文字列

"\"Hello\\r\\nWorld Foo!\"" 

を受けます。

プリミティブstring変数にJSONのリクエストボディをバインドするために、なぜ正しいとは何ですか? JavaScriptのクライアントで使われている変数stringを交換するだけで、無駄なコンテナクラスにすべてのプリミティブ型をラップしたくありません。

答えて

0

これはおそらくフレームワーク内のシリアル化のための一般的な方法と組み合わせたC#の設計上の決定の結果です。文字列型は不変です。インスタンスは一度作成すると変更できません。直列化の一般的なアプローチでは、目的の型のインスタンスを作成し、そのメンバ値を割り当てようとします。 選択肢がありますが、内蔵タイプのいくつかのことではないでしょう唯一の文字列は、不変で、他のほとんどのプリミティブは動作しますが、パラメータ私の頭の上オフ

Post["/text/{userString:string}"] = parameter => 
{ 
    // access the value herewith something like 
    string theString = parameter.userString 
} 

として値を渡すかもしれませんタプルや日時などの仕事。