2016-04-29 5 views
0

Ich versuche die 'eckige Best Practice' zu befolgen, indem ich einen eckigen Service verwende, der meine WebApi Aufrufe umschließt. Ich habe es zum größten Teil funktioniert, aber nicht herausfinden, wie die Abfrage-String mit den Kendo-Datenquellanforderung Parameter auf eine Weise, die korrekt auf der Webapi-Seite analysiert erstellen.AngularJS kendo Gitterbindung an eckigen Service webapi - Sortiert immer Null beim Parsen mit [fromuri]

Seite

<div ng-controller="HomeCtrl as ctrl"> 
     <div kendo-grid 
       k-pageable='{ "refresh": true, "pageSizes": true }' 
       k-ng-delay="ctrl.businessGridOption" 
       k-options="ctrl.businessGridOption"></div> 
    </div> 

TS/JS

module Tql.Controllers { 
    'use strict'; 
    export class BusinessWebApi { 
     public static $inject = ["$resource","$http"]; 
     public static IID = "BusinessWebApi"; 
     private httpService: ng.IHttpService; 
     public constructor($resource,$http) { 
      var vm = this;   
      vm.httpService = $http; 
     }   
     public GetBusinessCount() { 
      return this.httpService.get("/api/Business/GetBusinessCount"); 
     } 
     public GetBusinesses(kendoOptions) { 
      console.log(JSON.stringify(kendoOptions)); 
      return this.httpService.get("/api/Business/GetBusinesses" 
      + "?page=" + kendoOptions.page 
      + "&pageSize=" + kendoOptions.pageSize 
      + "&sort[0][field]=" + kendoOptions.sort.split('-')[0] + "&sort[0][dir]=" + kendoOptions.sort.split('-')[1]); 
     //%5B = '[' 
     //%5D = ']' 
    } 
}  
export interface IHomeCtrl { 
    Title: string 
} 
export class HomeCtrl implements IHomeCtrl { 
    public static $inject = [BusinessWebApi.IID]; 
    public Title: string; 
    public businessGridOption: any; 
    public constructor(myservice: BusinessWebApi) { 
     var vm = this; 
     vm.Title = "Welcome to TQL Admin.";   
     vm.businessGridOption = { 
      sortable: true, 
      filterable: true, 
      pageable: true,    
      columns: [ 
       { field: "BusinessId", title: "ID" }, 
       { field: "BusinessLegalName", title:"Name"}, 
       { field: "CreatedDate", title: "Created" }, 
      ],       
      dataSource: new kendo.data.DataSource({ 
       serverPaging: true, 
       serverSorting: true, 
       serverFiltering: true, 
       pageSize: 5,    
       transport: {       
        read: function (kendoOptions) { 
         this.options = { prefix: "" }; 
         var data = kendo.data.transports["aspnetmvc-ajax"].prototype.options.parameterMap.call(this, kendoOptions.data, "read", false); 

         myservice.GetBusinesses(data) 
          .success(function (data) { 
           kendoOptions.success(data); 
          }).error(function (error) { 
           kendoOptions.error(error); 
          });        
        }, 
        /* this only needs defined if you delegate the $get to the grid itself, which is bad practice for angular 
         since we have a service we need to call this manually (see above) 
    kendo.data.transports["aspnetmvc-ajax"].prototype.options.parameterMap.call 
        parameterMap: function (data, operation) { 
         return JSON.stringify(data); 
        } 
        */      
       }, 
       schema: { //this is needed to tell the grid how to parse the result object 
        data: function (data) { return data.Data; }, 
        total: function (data) { return data.Total; }, 
        errors: function (data) { return data.Errors; }       
       }  
      }), 


     };         
    } 
} 
angular.module('tql').service(BusinessWebApi.IID, BusinessWebApi); angular.module('tql').controller("HomeCtrl",HomeCtrl); } 

WebAPI

[RoutePrefix("api/Business")] 
public class BusinessApiController : ApiController 
{ 
    private TQLContext db = new TQLContext(); 

    [HttpGet] 
    [Route("GetBusinesses")]   
    public DataSourceResult GetBusinesses([FromUri]DataSourceRequest request) 
    { 
     //if (sort == null) 
     // sort = "BusinessId-asc"; 
     //var req = this.Request; 
     return db.Businesses.Select(x => x).ToDataSourceResult(request); 

    } 
    [HttpGet] 
    [Route("GetBusinessCount")] 
    public int GetBusinessCount() 
    { 
     return db.Businesses.Count(); 
    } 
} 
+0

Ich habe auch versucht, die codierte Version wie so, aber es war nicht ein ebenso + "& sortieren% 5B0% 5D% 5Bfield% 5D =" + kendoOptions.sort.split gehen ('-') [0] + "& sort% 5B0% 5D% 5Bdir% 5D =" + kendoOptions.sort.split ('-') [1]; –

Antwort

0

die Frage stellte sich heraus, war weniger auf der Client-Seite, bekam ich diese die oben genannten Methoden zu arbeiten aber ich benutze die folgenden auf der APIController Seite der Dinge, um die Abfragewerte korrekt zu analysieren. Dies wird vom Telerik-Team sehr schlecht dokumentiert.

public DataSourceResult Get([ModelBinder(typeof(WebApiDataSourceRequestModelBinder))] DataSourceRequest request)