c# - Angularjs 和 WebAPI Put 方法参数始终为空

标签 c# angularjs asp.net-web-api

我有一个应用程序突然停止工作。据我所知,我无法确定为什么这是可行的。我一定在这里遗漏了一些非常简单的东西。这是代码,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 }
    );
}

这是我的路线,以防出现问题。但我不这么认为,因为确实调用了该方法,只是没有传入参数。

[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;
}

那是 WebAPI 的用户 Controller ,这里没什么特别的。 Undelete 方法确实会被调用,但调用时间长吗?值参数始终为空。

(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]);

}());

这又是我的 Controller ,非常简单,我认为这里没有任何问题,但为了完整起见,我将其包括在内。

(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]);
}());

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

如有任何帮助,我们将不胜感激。谢谢。

最佳答案

您通过消息正文而不是 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;
        });
    };

关于c# - Angularjs 和 WebAPI Put 方法参数始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29775982/

相关文章:

c# - 将 DOM XmlElement 反序列化为 .NET 对象

c# - 事件的最佳执行

javascript - AngularJS ng-route如何在解析时发出http请求

http - HATEOAS Rel - 有任何标准吗?

c# - WebAPI 和 ILMerge(又名自托管单个 exe)

angularjs - WebAPI CORS 不允许 Post 请求

c# - 堆栈跟踪引用不存在的位置

c# - 获取 "This method or property cannot be called on Null values"错误

angularjs - 有没有办法通过 grunt 任务自动生成 karma.conf.js?

html - "vertical-align:middle"用作内联样式但不适用于外部 CSS