将MVC SelectListItems绑定到Knockout Observable Array

时间:2015-04-24 10:10:01

标签: c# asp.net-mvc knockout.js

有没有办法将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" })

这似乎根本没有从敲门模型结束时识别列表项,我得到的只是一个空数组(其余的属性都很好)。这是解决这个问题的最佳方法吗?

2 个答案:

答案 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()
        });
      }
   }
}