2014-05-08 46 views
1

所以我有一個視圖模型:麻煩與淘汰賽JSON模型解析MVC 4控制器

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>

PrelimViewModel客戶端的列表的ko.mapper甲GetPrelim控制器的方法:

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) 
+2

你已經將你的列表包裝到你的KO viewmodel中的一個屬性,所以用'data:ko.toJSON(viewModel.Prelims()),' – nemesv

+0

這樣做吧! –

+0

我將它包裝到一個屬性中,因爲它不知道調用foreach:在一個沒有數組父對象名稱的對象數組上,任何提示,我可能會通過data-bind =「foreach:。非常感謝! –

回答

3

你已經包裹你的名單分成在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 });併發送正確的數據回你的控制器可能會更好。