0

我在 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。我敢打赌,原因是availabaleTags 数组(@Html.Raw(Json.Encode(@Model.AvailableTags)))的初始化。我是对的?如果我将类型从列表更改为字符串,那么我可以看到绑定通常有效。

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

4

2 回答 2

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);
于 2013-09-24T21:42:12.913 回答
0

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

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

于 2013-11-20T12:20:41.240 回答