Angularjs和WebAPI放置方法参数始终为空

Luk*_*asz 4 c# asp.net-web-api angularjs

我有一个突然停止工作的应用程序.我无法确定为什么这是我知道它应该工作.我必须在这里找到一些非常简单的东西.这是代码,Angular代码调用API,API方法调用,但方法的参数始终为null.该呼叫是PUT呼叫.

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services

    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{value}",
        defaults: new { value = RouteParameter.Optional }
    );
}
Run Code Online (Sandbox Code Playgroud)

这是我的路线以防万一.但我不这么认为,因为方法确实被调用只是参数没有传入.

[Authorize]
public class UsersController : ApiController
{
    // PUT api/users/undelete
    [HttpPut]
    public void Undelete(long? value)
    {
        if (!value.HasValue)
        {
            throw new ArgumentNullException("[UsersController => Undelete(long? value)]");
        }

        new UsersBoundary(this.repository).UndeleteUser(value.Value);
    }

    public UsersController(IUsersRepository repository)
    {
        this.repository = repository;
    }

    public UsersController() : this(new UsersRepository()) {  }

    private readonly IUsersRepository repository;
}
Run Code Online (Sandbox Code Playgroud)

这就是WebAPI的用户控制器,这里没什么特别的.Undelete方法确实被调用但是长?value参数始终为null.

(function () {
    'use strict';

    var app = angular.module('adminpowertools');

    var HomeController = function ($scope, homeService) {

        $scope.searchString = '';
        $scope.currentPage = 1;

        $scope.undelete = function(user) {
            homeService.undeleteUser(user.recordId);
            angular.forEach($scope.users, function(value, key) {
                if (value.recordId === user.recordId) {
                    value.deleted = 0;
                }
            });
        };
    };

    app.controller('HomeController', ['$scope', 'HomeService', HomeController]);

}());
Run Code Online (Sandbox Code Playgroud)

这是我的控制器再次非常简单,我认为这里的任何事情都没有被打破,但我将其包括在内是为了完整性.

(function () {
    'use strict';

    var app = angular.module('adminpowertools');

    var HomeService = function ($http) {

        var undeleteUser = function(userId) {
            var uri = 'api/users/undelete';
            var data = { value: userId };

            return $http.put(uri, JSON.stringify(data)).success(function(data, status, headers, config) {
                return true;
            });
        };

        return {
            undeleteUser: undeleteUser
        };
    };

    app.factory('HomeService', ['$http', HomeService]);
}());
Run Code Online (Sandbox Code Playgroud)

这是调用控制器的服务.它再次调用控制器只是不传递数据变量中设置的值.我已经尝试将数据设置为'value ='+ userId,我尝试使用双引号和单引号,没有引号似乎没有任何效果.

任何帮助将不胜感激.谢谢.

Chr*_*ory 5

您通过消息正文而不是Uri传递数据(在本例中为值).默认情况下,Web Api将查询字符串参数的URI序列化为特定方法的变量,而不是正文.

更改Angular调用,通过"params"属性和"data"参数将值参数发送到$ http.注意我将它重构为一个配置对象,以传递到$ http以使其更清晰.

var undeleteUser = function(userId) {
        var config = {
            method: 'PUT',
            url: 'api/users/undelete',
            params: { value: userId }
        };            

        return $http(config).success(function(data, status, headers, config) {
            return true;
        });
    };
Run Code Online (Sandbox Code Playgroud)