从 aspnetmvc 序列化时忽略淘汰视图模型上的属性

Posted

技术标签:

【中文标题】从 aspnetmvc 序列化时忽略淘汰视图模型上的属性【英文标题】:Ignore properties on knockout viewmodel when serialized from aspnetmvc 【发布时间】:2013-08-12 23:11:50 【问题描述】:

我有一个 ASPNET mvc 站点,其中视图具有带有敲除的视图模型。我正在尝试将传递给视图的模型序列化为视图视图模型。

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

@model Client.Controllers.TripDto

使用 KO 映射创建的淘汰视图模型的完成方式类似于

        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:费用 [打破这个错误]

return new Function("$context", "$element", functionBody);

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

所以问题是,是否可以在我正在映射的模型中不存在所有属性的情况下使用 KO 映射?

【问题讨论】:

【参考方案1】:

是否可以在并非所有属性都存在的情况下使用 KO 映射 在我映射的模型中?

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

您只需要扩展您的视图模型,因此将新属性 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

【讨论】:

谢谢,该属性已经在自定义视图模型中定义为 self.expenses = ko.observableArray(); 我遇到了类似的问题,我使用 underscore.js 设置了默认的空数组/对象,这样映射插件就不会乱了。如果需要,很乐意提供示例链接。 实际上我的问题与延迟加载有关,现在正在使用这种方法。但是感谢有关创建的信息!

以上是关于从 aspnetmvc 序列化时忽略淘汰视图模型上的属性的主要内容,如果未能解决你的问题,请参考以下文章

我可以以编程方式触发淘汰视图模型更新吗?

当页面通过ajax作为部分加载时,如何重新绑定淘汰视图模型?

在淘汰赛中解除视图模型与视图的绑定

ajax发布后淘汰js更新视图模型

淘汰 Durandal 撰写视图 $root 访问权限

当我需要使用绑定重绘 html 时重新绑定淘汰赛 js