C# 敲除JSON模型解析MVC4控制器时出现问题
因此,我有一个ViewModel: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
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>