我有一个 ASPNET mvc 站点,其中的 View 具有带 knockout 的 View 模型。我正在尝试将传递给 View 的模型序列化到 View View 模型中。
模型像标准 aspnet mvc 一样传递给
@model Client.Controllers.TripDto
使用 KO 映射创建的 knockout View 模型的完成方式如下
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“自定义” View 模型上有属性(property)费用。问题是这个属性并不在 MVC 模型中,而只是一个稍后获取其数据的属性。 但到目前为止,我还无法将模型传递到 View 模型而不出现错误
Error: Unable to parse bindings. Message: ReferenceError: expenses is not defined; Bindings value: foreach: expenses [Break On This Error]
返回新函数("$context", "$element", functionBody);
我有点不确定是否真的是映射失败,但到目前为止还看不到任何其他可能的错误。
所以问题是,是否可以在我映射的模型中不存在所有属性的情况下使用 KO 映射?
最佳答案
is it possible to use KO mappings where not all properties are present in the model I'm mapping from?
我认为 KO 映射并不关心这一点,但模型关心这一点。当您调用 ko.applyBindings 时,KO 会搜索与 HTML 元素关联的属性,因此如果您要在 HTML 元素中使用属性 data-bind='id: property'
那么这个属性必须存在于你的 View 模型中。但如果它为空那就没问题了。
您只需扩展 View 模型,即可包含新属性 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
关于asp.net-mvc - 从 aspnetmvc 序列化时忽略 knockout View 模型上的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18173471/