1

次のクライアント側のコードフラグメントがあるとします。

var vm = {
  Input : "Label: Value",
  Rules : [
    { Name : "RemoveString",
      Params : [
        "Label: "
      ]
    }
  ]
};

$.post("/API/ApplyRule", vm, function(data) { });

そして、サーバー側の次のViewModel:

[Serializable]
public class ApplyRuleRequestViewModel
{
    public string Input { get; set; }
    public List<RuleViewModel> Rules { get; set; }
}

[Serializable]
public class RuleViewModel
{
    public string Name { get; set; }
    public List<string> Params { get; set; }
}

そして、次のコントローラーコード:

public class APIController : Controller
{
    [HttpPost]
    public ActionResult ApplyRule(ApplyRuleRequestViewModel model)
    {
        //Problem here... model is not fully deserialized into the ViewModel object.
        return View();
    }
}

クライアント側のViewModelのルール部分をシリアル化しようとすると問題が発生します。// Problem ...という上記のコントローラー行でコードをデバッグすると、トップレベルのオブジェクトプロパティがそれを作成したが、サブオブジェクトは作成しなかったことがわかります。だから、私は次のようなものを手に入れます:

var vm = new ApplyRuleRequestViewModel {
  Input = "Label: Value",
  Rules = new List<RuleViewModel> {
     new RuleViewModel { Name = null, Parameters = null }
  }
}

私は次のようなものを期待しています:

var vm = new ApplyRuleRequestViewModel {
  Input = "Label: Value",
  Rules = new List<RuleViewModel> {
     new RuleViewModel { 
         Name = "RemoveString", 
         Parameters = new List<string> { "Label: " }
     }
  }
}

私はここで何が間違っているのですか?Rules配列を適切にバインドしないのはなぜですか?

これを適切にバインドするには、独自のカスタムモデルバインダーを作成する必要がありますか?もしそうなら、どのように?

4

1 に答える 1

1

メッセージを JSON として送信できます。

var vm = {
  Input : "Label: Value",
  Rules : [
    { Name : "RemoveString",
      Params : [
        "Label: "
      ]
    }
  ]
};

$.postJson("/API/ApplyRule", vm, function(data) { }); // See below for definition of `.postJson`.

最後の引数jsonは、JSON が必要であることを示すために accept ヘッダーを設定します。JsonValueProviderFactoryデフォルトのモデル バインダーは、構造化されたメッセージを適切に読み取るために、組み込みと自動的に対話する必要があります。

EDIT何かを逃した。を設定する必要があるcontentTypeため.post、そのままでは機能しない場合があります。

JSON を投稿するためのヘルパー メソッドを次に示します ( post のように json を投稿して受信するだけではありません)。

$.postJson = function(url, data, success) {
  $.ajax({
            url: url,
            type: 'POST',
            dataType: 'json',
            data: JSON.stringify(data),
            contentType: 'application/json; charset=utf-8',
            success: success
        }); 
}
于 2012-06-12T05:26:04.793 に答える