将observableArray绑定到C#列表

时间:2013-09-21 10:52:54

标签: javascript asp.net-mvc asp.net-mvc-4 knockout.js

我在C#中有以下简化的ViewModel

public class SearchViewModel
{
    public IList<IdAndNameModel> AvailableTags { get; set; }
    public IList<IdAndNameModel> SearchTags { get; set; }
}

这在JavaScript中:

function ViewModel() {
    var self = this;
    self.allTags = ko.observableArray();
    self.searchTags = ko.observableArray();

    // stuff to fill the searchTags
}

var viewModel = new ViewModel();
ko.applyBindings(viewModel);
viewModel.allTags(@Html.Raw(Json.Encode(@Model.AvailableTags)));

现在我想将JavaScript属性绑定到SearchModel

@Html.HiddenFor(m => m.SearchTags, new { data_bind = "value: searchTags" })

以下是将数据提交给控制器的代码段:

$('#submitButton').click(function () {
    var form = $('#criteriaForm');
    $.ajax({
        url: form.attr('action'),
        type: form.attr('method'),
        data: form.serialize(),
        success: function (result) {
            // unimportant binding stuff
        }
    });
});

不幸的是,列表的长度始终为0.我打赌原因是可用标记数组(@Html.Raw(Json.Encode(@Model.AvailableTags)))的初始化。我是对的?如果我将类型从列表更改为字符串,那么我可以看到绑定通常正常。

有没有办法以这种方式绑定列表?

2 个答案:

答案 0 :(得分:1)

如果我是你,我会将$.ajax电话更改为更像这样:

$.ajax(form.attr('action'), {
    type: form.attr('method'),
    data: JSON.stringify({
        'AvailableTags': viewModel.allTags(),
        'SearchTags': viewModel.searchTags()
    }),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    success: function (response) {
        //Do your thang
    }
});

然后你的控制器将有一个看起来像这样的方法:

public ActionResult Test(SearchViewModel searchViewModel) {
    //Stuffy stuff, best stuff on earth
}

最后的建议是提出

viewModel.allTags(@Html.Raw(Json.Encode(@Model.AvailableTags)));

之前的

ko.applyBindings(viewModel);

答案 1 :(得分:0)

如果您不想单独发送它们,您可能需要尝试以下操作。解锁时C#列表存在此问题,因此在与C#端进行交互时,您需要将其转换回来。

data: JSON.stringify(ko.mapping.toJS(yourobject))