Knockout JS を使用して、MVC コントローラーに渡すモデルを構築しています。ko.observable() アイテムは問題なくコントローラーに渡されますが、ko.observableArray([]) データはコントローラーで「count=0」として表示されます。
以下は、ビューで構築しているオブジェクトです。
var AddViewModel = function () {
self.ModelRequest = {
Object: {
VarArray: ko.observableArray([]),
Var1: ko.observable(""),
Var2: ko.observable("")
}
};
....
ModelRequest.Object.VarArray は ko.observableArray であり、オブジェクトにいくつかの属性 (名前、ID、コード、タイプ) が含まれています。
以下は、JSON経由でデータを送信する方法です。
p = ko.toJSON(AddViewModel.ModelRequest);
debugger;
$.ajax({
url: url,
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: ko.toJSON(AddViewModel.ModelRequest),
success: function (data) {
...something...
}
});
コードをデバッグしているときに、上記の p 変数を調べると、次のように表示されます。
{"Object":{"VarArray":[{"Name":"Name 1", "Id":2, "Code":"50.1", "Type":"A"}],
"Var1":"abc", "Var2":"def"}}
コントローラーに渡されるオブジェクトを調べると、Var1 と Var2 は正しい値を持っていますが、VarArray は "Count=0" です。
何かご意見は?これを見ていただきありがとうございます。この時点で、私は任意のアイデアを試してみます!!
編集 10/6/13: これは私のコントローラー アクションです:
[HttpPost]
public CRUDResponse AddItem(AddRequest ModelRequest)
{
... something here ...
}
この時点で ModelRequest を調べると、VarArray が "Count = 0" であることがわかります。
編集 10/8/13: これは AddRequest の詳細です:
#region Public Members
public ObjectType Object { get; set; }
#endregion Public Members
ObjectType は次のとおりです。
#region Public Members
public int Var1 { get; set; }
public int Var2 { get; set; }
public List<SpecType> VarArray { get; set; }
#endregion Public Members
SpecType の場所
public string Name { get; set; }
public int Id { get; set; }
public string Code { get; set; }
public FieldType Type { get; protected set; }
FieldType は Enum です。
更新:問題を見つけたところです。UI から Web API を呼び出すと、JSON を介してプロパティが適切にシリアル化されていないようです。上記のプロパティは TypeB を継承した TypeA です。TypeB には、TypeA に必要なすべてのフィールドが含まれています。シリアル化に失敗したプロパティを TypeA ではなく TypeB に変更すると、正常にシリアル化され、必要なすべての値が Web API に反映されます。
したがって、基本的に、型が別の型から派生している場合、JSON は値のシリアル化に失敗します。値を基本型として宣言して継承を削除すると、問題が修正されます。
では、型が別のクラスから継承されたプロパティをシリアル化する方法はありますか?
エリック