从 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 序列化时忽略淘汰视图模型上的属性的主要内容,如果未能解决你的问题,请参考以下文章