2014-04-21 3 views
0

나는이 게시물을 여기에 따라 갔다 POST a complex viewmodel to a controller하지만 약간 도움이되지 않았다.컨트롤러에 복잡한 KO ViewModel을 반환

{ 
    "selectedCatalog": 7, 
    "catalogs": [ 
    { 
     "name": "EDI Outbound", 
     "catalogId": 7, 
     "enabled": true, 
     "aggregate": true 
    }, 
    { 
     "name": "CSV Aggregate Outbound", 
     "catalogId": 8, 
     "enabled": true, 
     "aggregate": true 
    }, 
    { 
     "name": "CSV Non-Aggregate Outbound", 
     "catalogId": 9, 
     "enabled": true, 
     "aggregate": false 
    } 
    ], 
    "catalogConfiguration": [ 
    { 
     "pdbColumnName": "Active", 
     "outboundColumnName": "Active", 
     "pdbColumnId": 2, 
     "selectedColumn": 2 
    }, 
    { 
     "pdbColumnName": "Category", 
     "outboundColumnName": "Category", 
     "pdbColumnId": 3, 
     "selectedColumn": 3 
    }, 
    { 
     "pdbColumnName": "Inventory", 
     "outboundColumnName": "Inventory", 
     "pdbColumnId": 4, 
     "selectedColumn": 4 
    }, 
    { 
     "pdbColumnName": "Manufacturer", 
     "outboundColumnName": "Manufacturer", 
     "pdbColumnId": 5, 
     "selectedColumn": 5 
    }, 
    { 
     "pdbColumnName": "ManufacturerSKU", 
     "outboundColumnName": "ManufacturerSKU", 
     "pdbColumnId": 6, 
     "selectedColumn": 6 
    }, 
    { 
     "pdbColumnName": "MSRP", 
     "outboundColumnName": "MSRP", 
     "pdbColumnId": 7, 
     "selectedColumn": 7 
    }, 
    { 
     "pdbColumnName": "Name", 
     "outboundColumnName": "Name", 
     "pdbColumnId": 8, 
     "selectedColumn": 8 
    }, 
    { 
     "pdbColumnName": "Price", 
     "outboundColumnName": "Price", 
     "pdbColumnId": 9, 
     "selectedColumn": 9 
    }, 
    { 
     "pdbColumnName": "SKU", 
     "outboundColumnName": "SKU", 
     "pdbColumnId": 10, 
     "selectedColumn": 10 
    }, 
    { 
     "pdbColumnName": "UPC", 
     "outboundColumnName": "UPC", 
     "pdbColumnId": 11, 
     "selectedColumn": 11 
    }, 
    { 
     "pdbColumnName": "Weight", 
     "outboundColumnName": "Weight", 
     "pdbColumnId": 12, 
     "selectedColumn": 12 
    } 
    ] 
} 

내가 작업 할 내 컨트롤러에이 활용하는 방법을 잘 모르겠어요 :

은 내가 페이지에 JSON으로 모델을 덤프하는 경우는 다음과 같습니다하는 뷰 모델이있다. 내가 다시 게시 할 수 있어요하지만 문자열은 다음에서 널 : 컨트롤러

[HttpPost] 
     public void UpdateCatalog(string data) 
     { 
      var heh = data; 
     } 

보기

function CatalogConfigurationModel(data) { 
    var self = this; 
    self.pdbColumnName = ko.observable(data.PDBColumnName); 
    self.outboundColumnName = ko.observable(data.OutboundColumnName); 
    self.pdbColumnId = ko.observable(data.PDBColumnId); 
    self.selectedColumn = ko.observable(data.ConfiguredColumnId); 
} 

function CatalogList(data) { 
    var self = this; 
    self.name = ko.observable(data.Name); 
    self.catalogId = ko.observable(data.Id); 
    self.enabled = ko.observable(data.Enabled); 
    self.aggregate = ko.observable(data.Aggregate); 
} 


var ViewModel = function() { 
    var self = this; 
    self.submitChanges = function() { 
     var data = ko.toJS(ViewModel); 
     $.post('/PDBConfig/UpdateCatalog/', 
      data, 
      function(status) { 
       alert(status); 
      }); 
    }; 
    //self.catalogs = ko.observableArray([ 
    //new CatalogList('EDI Outbound', 2, 1), 
    //new CatalogList('CSV Outbound', 1, 1) 
    //]); 

    self.selectedCatalog = ko.observable(); 
    self.catalogs = ko.observableArray([]); 
    self.catalogConfiguration = ko.observableArray([]); 

    $.getJSON(
     "/PDBConfig/GetCatalogList/", 
     function (data) { 
      var mappedTasks = $.map(data, function (item) { return new CatalogList(item) }); 
      self.catalogs(mappedTasks); 
      self.selectedCatalog(self.catalogs[1]); 
      $.getJSON(
      "/PDBConfig/GetCatalogConfig/", 
      { id: data[0].Id }, 
      function (catalogData) { 
       var mappedCatalog = $.map(catalogData, function (item) { return new CatalogConfigurationModel(item) }); 
       self.catalogConfiguration(mappedCatalog); 
      }); 

     }); 


}; 
$(document).ready(function() { 
    var model = new ViewModel(); 

    model.selectedCatalog.subscribe(function (newValue) { 
     $.getJSON(
      "/PDBConfig/GetCatalogConfig/", 
      { id: newValue }, 
      function (catalogData) { 
       var mappedCatalog = $.map(catalogData, function (item) { return new CatalogConfigurationModel(item) }); 
       model.catalogConfiguration(mappedCatalog); 
      }); 
    }); 

    ko.applyBindings(model); 

내가 매핑에 시작하는 곳 그래서 질문은 C#에서이 다시 내가 만들 마십시오 내 JSON 문자열에있는 것과 동일한 명명 규칙을 가진 모델?

+0

추가 참조에 대한 내 생각의 나머지 :이 라이브러리의 구현에 대한 질문이 있으면

의 SO 그룹을 방문하십시오. 내 배열 내의 값을 C# 모델에 넣을 명명 규칙과 일치시킬 필요가 있는지 확실하지 않습니다. –

답변

0

컨트롤러에 문자열로 전달하면 시작할 수 있습니다. Newtonsoft JSonNet Convertor (http://www.newtonsoft.com/json)는 이러한 변환을 처리하는 데 사용하는 프레임 워크입니다. 이 라이브러리와

, 당신은 같은 개체에 직접 문자열을 전달할 수 있습니다

[HttpPost] 
public JsonNetResult UpdateCatalog (UpdateCatalogModel data) { ... } 

당신은 또한 당신의 컨트롤러로를 통과 한 후 개체에 대한 위로 문자열을 변환하는 시리얼 라이저 방법을 사용할 수 있습니다. https://stackoverflow.com/questions/tagged/json.net

+0

게시 할 때 문자열이 항상 null입니다. –

+0

ko.toJS 대신 ko.toJSON을 사용하십시오 ... 오래된 (er) ko 라이브러리가있을 수 있습니다 – beauXjames

+0

참조 용으로 녹아웃을 추가했습니다. 변경 후에도 여전히 null입니다. –

관련 문제