2013-05-29 5 views
0

저는 WebApi를 처음 사용하기 때문에 수신 된 게시 매개 변수에 문제가 있습니다. webpi 컨트롤러 메서드에서받은 데이터로 jqgrid를 채우고 싶습니다.WepApi 게시 매개 변수가 null입니다.

buildPostData: function (postData) { 

      var parameters = { 
       page: postData.page, 
       rows: postData.rows, 
       sidx: '', 
       sord: '', 
       _search: false, 
       searchField: '', 
       searchString: '', 
       searchOper: '', 
       filter: { groupOp: '', rules: [] } 
      }; 

      $.extend(parameters, postData); 

      var data = { 
       parameters: parameters 
      }; 

      return JSON.stringify(data); 
     } 

bindGridAllData: function() { 

      var viewModel = this; 

      jQuery("#AllDataGrid").jqGrid({ 
       url: 'api/DataApi/GetAllData', 
       datatype: 'json', 
       mtype: 'POST', 
       ajaxGridOptions: { 
        contentType: 'application/json; charset=utf-8' 
       }, 
       serializeGridData: viewModel.buildPostData, 
       serializeRowData: function (data) { 
        return JSON.stringify(data); 
       }, 
       jsonReader: { repeatitems: false, root: "d.rows", page: "d.page", total: "d.total", records: "d.records" }, 
       colNames: ['DataId', 'Title', 'Description', 'Date', 'UserId', 'Name', 'Surname', 'PicturePath', 'NumberOfComments', ''], 
       colModel: [ 
         { name: 'DataId', index: 'DataId', width: 10, hidden: true, editable: false, sortable: false, key: true }, 
         { name: 'Title', index: 'Title', width: 10, editable: false, align: 'left', sortable: true, hidden: true }, 
         { name: 'Description', index: 'Description', width: 10, editable: false, align: 'left', sortable: true, hidden: true }, 
         { name: 'Date', index: 'Date', width: 10, editable: false, align: 'left', sortable: true, hidden: true }, 
         { name: 'UserId', index: 'UserId', width: 10, editable: false, align: 'left', sortable: true, hidden: true }, 
         { name: 'Name', index: 'Name', width: 10, editable: false, align: 'left', sortable: true, hidden: true }, 
         { name: 'Surname', index: 'Surname', width: 10, editable: false, align: 'left', sortable: true, hidden: true }, 
         { name: 'PicturePath', index: 'PicturePath', width: 10, editable: false, align: 'left', sortable: true, hidden: true }, 
         { name: 'NumberOfComments', index: 'NumberOfComments', width: 10, editable: false, align: 'left', sortable: true, hidden: true }, 
         { 
          name: 'DataInformation', index: 'DataInformation', width: 200, editable: false, align: 'left', sortable: true, formatter: function (cellvalue, options, rowObject) { 
           var template = $('<div data-bind="template: { name: \'DataRecord\', data: DataRecord, ajax: { async: false } }"></div>'); 
           var data = { DataRecord: rowObject }; 
           ko.applyBindings(data, template[0]); 

           return template.html(); 
          } 
         } 
       ], 
       height: '100%', 
       width: 900, 
       pager: '#resultGridAllDataPager', 
       rowNum: 10, 
       rownumbers: false, 
       scroll: false, 
       sortname: 'Date', 
       sortorder: "asc", 
       gridview: true, 
       hoverrows: false, 
       viewrecords: true, 
       cmTemplate: { title: false }, 
       loadComplete: function() { 
       } 
      }); 
     } 

그리고 WebApi 방법이다 : 다음

격자 코드는

[HttpPost] 
    public JQGridData GetAllData(JQGridSearchParameters parameters) 
    { 
     using (dataMKbazaEntities context = new dataMKbazaEntities()) 
     { 
      JQGridData grid = new JQGridData(); 

      var allData = context.ispolniSITEpodatoci().ToList(); 

      List<object> data = new List<object>(); 

      foreach (var ad in allData) 
      { 
       data.Add(new { 
        DataId=ad.podatokID, 
        Title=ad.naslov, 
        Description=ad.opis, 
        Date=ad.datum, 
        UserId=ad.idKORISNIK, 
        Name=ad.ime, 
        Surname=ad.prezime, 
        PicturePath=ad.slika, 
        NumberOfComments=ad.brojKOMENTARI 
       }); 
      } 

      grid.rows = data; 
      grid.page = parameters.page; 
      grid.records = data.Count; 
      grid.total = (int)Math.Ceiling((float)data.Count/(float)parameters.rows); 

      return grid; 
     } 
    } 

데이터를 전송하는 파라미터 값 buildPostData 방법에서 정의 왔지만 WepApi 제어 방법에서 수신 된 때 널입니다.

나는 webapi 방법에서 [FromBody]으로 시도했지만 성공하지 못했습니다. HTTP 요청에서 상태 코드는 200 OK

+0

왜 데이터를 가져 오기 위해 'POST'를 사용합니까? GET이 올바른 방법이 아닌가? – vadim

+0

네,하지만 쿼리 문자열에 전송 된 데이터를 원하지 않기 때문에 POST를 사용하고 싶습니다. – user1565840

+0

죄송합니다.하지만 buildPostData 함수를 사용하는 데 아무런 의미가 없습니다. 왜 'parameters'속성을 가진 객체의 내부에있는'GetAllData'에 보낼 모든 매개 변수를 넣어야합니까? 왜'return JSON.stringify (postData); '를 직접 사용하지 않습니까? 당신은'JQGridSearchParameters'에 대한 정의를 포함시키지 않으므로 여러분의 질문에 완전한 대답을 할 수 없습니다. 어떤 식 으로든 [블로그] (http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx)를 읽어 보시고 모델 바인딩 및 포매터의 주요 방법. – Oleg

답변

0

는 다음을 확인하다 :

  1. 원시 요청은 Content-Type 헤더를 가지고있다. 클라이언트 코드를 보면 전송하는 것처럼 보일뿐 실제로 전송되는 코드인지 확인하려고합니다. 웹 API에는 콘텐츠 형식 헤더를 보내지 않으면 콘텐츠를 deserialize 할 형식 지정자를 알 수 없으므로 기본적으로 C# 형식의 기본값이 기본값입니다. 이 경우 'null'일 수 있습니다. 이 문제는 나중에 수정되었으며 공개적으로 사용할 수 없습니다.

  2. 는 모델 상태 오류를 보려면 다음 체크 유무 : (! ModelState.IsValid)

    경우 { 던져 새로운 HttpResponseException (Request.CreateErrorResponse (HttpStatusCode.BadRequest, this.ModelState)); }

관련 문제