如何使用角度中的$ resource将json对象作为GET传递?

时间:2015-11-17 14:06:21

标签: asp.net angularjs asp.net-web-api

如何使用角度中的$ resource将json对象传递给WebApi作为GET?

我的服务:

pmsService.factory('Widgets', ['$resource', function ($resource) {

    var data = $resource('/api/:path/:id', {
        path: '@path'
    }, {
        getWidgets: {
            params: { path: 'widgets' },
            method: "GET",
            isArray: true
        },
        getWidget: {
            params: { path: 'widgets' },
            method: "GET",
            isArray: false
        },
        getWidgetData: {
            params: { path: 'widgets' },
            method: "POST"
        },
    });
    return data;

在角度控制器中:

Widgets.getWidgetData({ id: $scope.widget.id}, $scope.paramValues ).$promise.then(function (data) {
                $scope.widget.Data = data;
                $log.debug($scope.widget.Data);
            });

在控制器中:

[Route("api/widgets/{id}")]
[HttpPost]
public Object Get(int id, dynamic prms)
   {
     ....
   }

这应该向WebApi Controller,id和Widget的参数列表发送2个参数。提琴手表示:

  

/ API /部件/ 31 /%5Bobject%20Object%5D

所以路由工作正常,但我收到的对象prms是空的。

1 个答案:

答案 0 :(得分:1)

我真的不明白你要做什么但是 如果您正在尝试使用/api/widgets/31?foo=bar中的url参数,那么我就是这样做的。

angular
  .module('myMod', ['$resource'])

  .factory('Widgets',
  ['$resource', function ($resource) {
    return $resource(
      '/api/:path/:id/',
      {'path': '@path'},
      {
        getWidgets: {
          params: {path: 'widgets'},
          method: "GET",
          isArray: true
        },
        getWidget: {
          params: {path: 'widgets'},
          method: "GET",
          isArray: false
        },
        getWidgetData: {
          params: {path: 'widgets'},
          method: "GET",
          isArray: false
        }
      })
  }])

  .controller('WidgetsController',
  ['$scope', 'Widgets', function ($scope, Widgets) {
    $scope.widget = Widgets.getWidget({
      id: 1,
      foo: 'bar'
    });
  }]);

这会向/api/widgets/1?foo=bar发出GET请求。您可以包含嵌套对象或这样的数组,它将被序列化并附加到URL

  // In controller
  .controller('WidgetsController',
  ['$scope', 'Widgets', function ($scope, Widgets) {
    $scope.widget = Widgets.getWidget({
      id: 1,
      fields: ['name', 'price']
    });
  }]);

这会向/api/widgets/1?fields=name&fields=price发出GET请求。 我通常更喜欢使用$httpParamSerializerJQLike序列化程序来序列化此格式/api/widgets/1?fields[]=name&fields[]=price的参数,根据我的经验,这些参数问题较少。要使用此序列化程序,您需要像这样配置$http

angular
  .module('myMod')

  .config(['$httpProvider', function ($httpProvider) {
    $httpProvider.defaults.paramSerializer = '$httpParamSerializerJQLike';
  }])

希望有所帮助