1

我正在使用 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 无法序列化一个值。通过将值声明为基本类型来删除继承可解决此问题。

那么,有没有办法序列化类型从另一个类继承的属性?

埃里克

4

1 回答 1

0

我认为问题在于 A:您永远不会填充 observableArray,或者 B:您没有在控制器上接收到正确的对象类型,或者是因为您发送不正确或接收不正确。

尝试这样做 -

function testData(name) {
    var self = this;
    self.Name = ko.observable(name);
}

在您的视图模型内部

var AddViewModel = function () {
    self.ModelRequest = {
        Object: {
            varArray: ko.observableArray([
                new testData('Your my boy blue'),
                new testData('Frank the tank')
        ]),
        var1: ko.observable(""),
        var2: ko.observable("")
        }
    };
}

并查看您的控制器操作是否实际上正在取回您的数据。

如果不是,那么您很可能不会将发送给控制器的对象与控制器识别的对象匹配。

于 2013-10-07T02:03:15.847 回答