繁体   English   中英

解决MVC 4控制器的Knockout JSON模型问题

[英]Trouble with Knockout JSON Model parsing MVC 4 Controller

所以我有一个ViewModel:

public class PrelimViewModel
    {
        public int? PrelimId { get; set; }
        public int JobId { get; set; }
        public string Code { get; set; }
        public string Description { get; set; }
        public string Comment { get; set; }
        public string Unit { get; set; }
        public int? Qty { get; set; }
        public decimal? BidPrice { get; set; }
        public bool Accepted { get; set; }
        public int? OriginalPrelimId { get; set; }
        public string Option { get; set; }
        public List<RefCodeViewModel> Codes { get; set; }
        public List<UnitViewModel> Units { get; set; }
        public List<OptionLetterViewModel> Options { get; set; }
    }

返回List<PrelimViewModel> GetPrelim控制器方法

PrelimViewModel客户端列表的ko.mapper:

 viewModel = ko.mapping.fromJS({ Prelims: data });
                ko.applyBindings(viewModel);

做一些工作,准备保存:

  function savePrelims(elem) {
            var $form = $(elem).parents('form');

            $.ajax({
                url: $form.attr('action'),
                type: "POST",
                data: ko.toJSON(viewModel),
                datatype: "json",
                contentType: "application/json charset=utf-8",
                success: function(data) { toastr.success('Options Saved!'); },
                error: function(data) { }
            });
}

我无法让我的MVC方法解析JSON:

public void AddPrelims(List<PrelimViewModel> Prelims)

您已将列表包装到KO视图模型中的Prelims属性中,但在服务器端,您只需要一个不具有其Prelims属性中具有列表的对象的列表。

所以要解决这个问题,你只需要在你的ajax请求中发送列表:

data: ko.toJSON(viewModel.Prelims()),

但是,如果您的viewmodel上没有任何其他属性,则无需包装列表,因为您可以这样做:

viewModel = ko.mapping.fromJS(data);
ko.applyBindings(viewModel);

然后在您的视图中,您可以绑定到$data ,这将引用当前的viewmodel,它将是您的数组:

<div data-bind="foreach: $data">
   ...
</div>

在这种情况下,您不必更改您的ajax调用和data: ko.toJSON(viewModel),应该可以正常工作。

然而,这个foreach: $data有点奇怪,它不是最好的解决方案,所以如果你坚持使用ko.mapping.fromJS({ Prelims: data });原始方法,你可能会更好ko.mapping.fromJS({ Prelims: data }); 并将正确的数据发送回您的控制器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM