2

私は単純なJavaScript文字列とオブジェクトを持っています:

var name = "Scarlett Johansson";
var args = { arg1: "foo", arg2: "bar" };

$.ajaxそして、それらをWeb API コントローラーに渡したい:

public string Get([FromUri]TestClass input) {
    // would like Args model-bound 
}

そして、私の TestClass は次のとおりです。

public class TestClass
{
    public string Name { get; set; }
    public Dictionary<string, string> Args { get; set; }
}

Name プロパティは期待どおりにバインドされていますが、 Argsをバインドする方法が見つかりません。、 の代わりにonJSON.stringify(args)$.param(args)使用してみましたが、何も機能しませんでした。List<KeyValuePair<string,string>>TestClassDictionary

JSON を手動で逆シリアル化するのではなく、モデル バインディングを介してこれを実現できることを期待していました。これは可能ですか?

明確化:キー/値の数は呼び出しごとに「引数」が異なるため、辞書が必要です。

4

2 に答える 2

1

デフォルトのモデル バインディングはそのようには機能せず、オブジェクトのパブリック プロパティにバインドしようとします。この例では、次のようなクラスが必要です。

public class ArgClass
{
    public string Arg1 { get; set; }
    public string Arg2 { get; set; }
}

public class TestClass
{
    public string Name { get; set; }
    public List<ArgClass> Args { get; set; }
}

あなたがやりたいと思われる代替手段は、カスタムモデルバインダーを作成することです。または、簡単なグーグル検索で、誰かがすでに実装しているように見えるこの DefaultDictionaryBinder が見つかります

https://github.com/loune/MVCStuff/blob/master/Extensions/DefaultDictionaryBinder.cs

更新:Web APIを使用していることに気付きましたが、これは少し異なると思います。Web API のバインディングのしくみを説明するブログ投稿を次に示します。

于 2013-06-07T11:42:52.763 に答える
0

次のように、(渡した結果を確認するために) 実装を使用してメソッドを拡張しましょう。

public HttpResponseMessage Get([FromUri]TestClass input)
{
    return Request.CreateResponse<TestClass>(HttpStatusCode.OK, input);
}

そして、これを見たい場合:

{
 "Name":"MyName",
 "Args":
  {
   "FirstKey":"FirstValue",
   "SecondKey":"SecondValue"
  }
}

つまり、testClass.Name == "MyName"次のtestClass.Args["FirstKey"] == "FirstValue"ように API を呼び出すことができます。

api/MyService/?name=MyName&args[0].key=FirstKey&args[0].value=FirstValue&args[1].key=SecondKey&args[1].value=SecondValue

わかりやすくするために、区切り行のパラメーター ( URI には改行がありません!) :

api/MyService/
  ?name=MyName
  &args[0].key=FirstKey
  &args[0].value=FirstValue
  &args[1].key=SecondKey
  &args[1].value=SecondValue
于 2013-06-07T17:45:08.783 に答える