【问题标题】:Trouble with Knockout JSON Model parsing MVC 4 Controller淘汰 JSON 模型解析 MVC 4 控制器的问题
【发布时间】:2014-06-25 12:27:53
【问题描述】:

所以我有一个 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&lt;PrelimViewModel&gt; 的 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 视图模型中的一个属性中,因此与 data: ko.toJSON(viewModel.Prelims()), 非常吻合
  • 我将它包装到一个属性中,因为它不知道调用 foreach: 在没有父名称的数组对象数组上,任何提示,我虽然可能 data-bind="前锋:。”非常感谢!

标签: c# asp.net-mvc json asp.net-mvc-4 knockout.js


【解决方案1】:

您已将列表包装到您的 KO 视图模型中的 Prelims 属性中,但在服务器端,您期望的只是一个列表,而不是在其 Prelims 属性中包含该列表的对象。

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

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-01
    • 2013-06-15
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 2016-11-03
    • 2014-01-01
    • 1970-01-01
    相关资源
    最近更新 更多