从aspnetmvc序列化时,忽略knockout viewmodel上的属性

时间:2013-08-11 15:24:39

标签: asp.net-mvc knockout.js knockout-mapping-plugin

我有一个ASPNET mvc网站,视图有淘汰视图模型。我正在尝试将传递给视图的模型序列化到视图视图模型中。

模型传递给类似标准的aspnet mvc

@model Client.Controllers.TripDto

使用KO映射创建的knockout viewmodel就像

一样
        var jsonModel = '@Html.Raw(JsonConvert.SerializeObject(this.Model))';
        var mvcModel = ko.mapping.fromJSON(jsonModel);
        var viewModel = new TripViewModel();
        var mapping = {
            'ignore': ["expenses"]
        };
        ko.mapping.fromJS(mvcModel, mapping, viewModel);

        ko.applyBindings(viewModel);

我在KO“自定义”视图模型上有属性费用。问题是该属性不在MVC模型中,而只是稍后获取其数据的属性。 但到目前为止,我还没有能够将模型传递给视图模型而没有错误

  

错误:无法解析绑定。消息:ReferenceError:费用未定义;绑定价值:foreach:费用   [打破此错误]

返回新函数(“$ context”,“$ element”,functionBody);

我有点不确定它是否确实是映射失败,但到目前为止无法看到任何可能的错误。

所以问题是,是否有可能使用KO映射,而我所映射的模型中并不存在所有属性?

1 个答案:

答案 0 :(得分:2)

  

是否可以使用KO映射,而不是所有属性都存在   在我正在映射的模型中?

我认为KO映射不关心这一点,但模型关心。当您调用ko.applyBindings时,KO将搜索与HTML元素关联的属性,因此,如果要在HTML元素data-bind='id: property'中使用属性,则此属性必须存在于View-Model中。但是如果它是null那么就可以了。

您只需要扩展视图模型,然后包含新属性expenses,其默认值为null

var mapping = {
    create: function (options) {
        //customize at the root level.  
        var innerModel = ko.mapping.fromJS(options.data);

        innerModel.expenses= null;

        return innerModel;
    }
}

请检查此SO question