次のクライアント側のコードフラグメントがあるとします。
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配列を適切にバインドしないのはなぜですか?
これを適切にバインドするには、独自のカスタムモデルバインダーを作成する必要がありますか?もしそうなら、どのように?