【发布时间】:2013-10-13 09:50:38
【问题描述】:
我正在使用 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”。
有什么想法吗?感谢您花时间看这个。我会在这一点上尝试任何想法!
编辑 2013 年 10 月 6 日: 这是我的控制器操作:
[HttpPost]
public CRUDResponse AddItem(AddRequest ModelRequest)
{
... something here ...
}
此时,当我检查 ModelRequest 时,我看到 VarArray 是“Count = 0”。
2013 年 10 月 8 日编辑: 这是 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 就无法序列化一个值。通过将值声明为基本类型来删除继承可解决此问题。
那么,有没有办法序列化类型从另一个类继承的属性?
埃里克
【问题讨论】:
-
你能展示你的控制器动作吗?是否有任何 ModelState 错误?
-
我在上面的帖子中添加了控制器操作。我没有任何 ModelState 错误。
-
谢谢——
AddRequest的类是什么样的? -
安德鲁,请查看我对帖子所做的修改。希望这能回答你的问题。如果没有,请告诉我我还能提供什么帮助。再次感谢您的帮助。
-
我很难相信在
p = ko.toJSON(AddViewModel.ModelRequest);中,AddViewModel构造函数有一个属性ModelRequest。也许您想在使用构造函数创建的对象上使用ModelRequest属性。
标签: asp.net-mvc json asp.net-mvc-4 knockout.js