我在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))
)的初始化。我是对的?如果我将类型从列表更改为字符串,那么我可以看到绑定通常正常。
有没有办法以这种方式绑定列表?
答案 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))