有没有办法将List<SelectListItem>
从MVC ViewModel绑定到Knockout可观察数组?
我的模型属性:
public List<SelectListItem> ListItems{ get; set; }
KO ViewModel详细信息:
self.ListItems = ko.observableArray();
self.setModel = function (objFromServer) {
if (!objFromServer) return;
self.ListItems.removeAll(); // clear array first
if (objFromServer.ListItems && objFromServer.ListItems.length > 0) {
for (var i = 0; i < objFromServer.ListItems.length; i++) {
var _iter_item = objFromServer.ListItems[i];
self.ListItems.push(_iter_item);
}
}
}
模型绑定:
var mvcModel = ko.mapping.fromJS(@Html.Raw(Json.Encode(Model)));
var newViewModel = new viewmodel();
newViewModel.setModel(mvcModel);
ko.applyBindings(newViewModel);
Razor控制(目前是剑道,但可以更改):
@Html.Kendo().ComboBoxFor(x => x.Item).BindTo(Model.ListItems).SelectedIndex(0).HtmlAttributes(new { data_bind = "value: $data.Item" })
这似乎根本没有从敲门模型结束时识别列表项,我得到的只是一个空数组(其余的属性都很好)。这是解决这个问题的最佳方法吗?
答案 0 :(得分:1)
尝试
@(Html.Kendo().ComboBoxFor().HtmlAttributes(new { data_bind = "value: $data.Item" })
答案 1 :(得分:0)
经过几天的痛苦,我设法弄明白了。在我的案例中,有一些事情导致了问题。首先,由于它正在新建一个数组,而我的测试数据中只有一个项目(愚蠢地),我不得不将length > 0
的检查更改为>= 0
。第二个问题是我选择项目的方式。我只是试图将对象直接推入可观察数组,而不是创建一个新项目。
self.ListItems = ko.observableArray();
self.setModel = function (objFromServer) {
if (!objFromServer) return;
self.ListItems.removeAll(); // clear array first
if (objFromServer.ListItems && objFromServer.ListItems.length >= 0) {
for (var i = 0; i < objFromServer.ListItems.length; i++) {
var _iter_item = objFromServer.ListItems()[i]; //select using ()
//select the id and name and assign them from the select list item
self.ListItems.push({
id: _iter_item.Value(),
name: _iter_item.Text()
});
}
}
}