C# 敲除JSON模型解析MVC4控制器时出现问题

C# 敲除JSON模型解析MVC4控制器时出现问题,c#,asp.net-mvc,json,asp.net-mvc-4,knockout.js,C#,Asp.net Mvc,Json,Asp.net Mvc 4,Knockout.js,因此,我有一个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 Comm

因此,我有一个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; }
    }
做一些工作,准备保存:

  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)
public void AddPrelims(列表Prelims)

您已将列表包装到KO viewmodel中的
Prelims
属性中,但在服务器端,您只需要一个列表,而该列表不包含在其
Prelims
属性中的对象

因此,要解决此问题,只需在ajax请求中发送列表:

data: ko.toJSON(viewModel.Prelims()),
但是,如果viewmodel上没有任何其他属性,则无需包装列表,因为您只需执行以下操作:

viewModel = ko.mapping.fromJS(data);
ko.applyBindings(viewModel);
然后在视图中,您可以绑定到引用当前viewmodel的
$data
,该viewmodel将成为您的数组:

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

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


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

您已经将列表包装到KO viewmodel中的属性中,因此使用
数据:KO.toJSON(viewmodel.Prelims()),
我将其包装到属性中,因为它不知道如何调用foreach:在没有数组父名称的对象数组上,有什么提示吗,我想也许data bind=“foreach:”非常感谢!
<div data-bind="foreach: $data">
   ...
</div>