我正在使用 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,在对象中包含几个属性:Name、Id、Code、Type。
下面是我如何通过 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 是一个枚举。
更新:我刚刚发现了问题。当我从 UI 调用我的 Web API 时,该属性似乎没有通过 JSON 正确序列化。上述属性是继承自 TypeB 的 TypaA 类型。TypeB 包含 TypeA 所需的所有字段。当我将无法序列化的属性更改为 TypeB 类型而不是 TypeA 时,它可以很好地序列化,并且我得到了我需要在 Web API 中反映的所有值。
因此,基本上,如果 JSON 的类型是从另一种类型派生的,则 JSON 无法序列化一个值。通过将值声明为基本类型来删除继承可解决此问题。
那么,有没有办法序列化类型从另一个类继承的属性?
埃里克