在angularjs中使用$ resource服务时访问响应头

时间:2014-10-16 05:44:28

标签: angularjs asp.net-web-api

我有一个web api POST方法,当我发布成功保存的消息对象时,它会在http响应消息中返回一个位置标头。 Post方法如下:

public class MessagesController : ApiController
    {
        public HttpResponseMessage Post(Message message)
        {
            HttpResponseMessage result = new HttpResponseMessage();

            if (ModelState.IsValid)
                {
                    // code to save message in database 
                    ... 

                    result = Request.CreateResponse(HttpStatusCode.Created);

                    result.Headers.Location = new Uri(Request.RequestUri, "messages/" + message.Id.ToString());
                }
                else
                {
                    result = Request.CreateResponse(HttpStatusCode.BadRequest, GetErrorMessages());
                }

            return result;
        }

        private IEnumerable<string> GetErrorMessages()
        {
            return ModelState.Values.SelectMany(x => x.Errors.Select(e => e.ErrorMessage));
        }
    }

在我的角度服务中,我使用$ resource服务发出POST请求,如下所示:

myApp.factory("messageRepository", ['$resource', function ($resource) {

    return {       
        save: function(message) {
            return $resource('/api/messages').save(message);
        }
    };

}]);

在我的角度控制器中,我调用了我的角度服务的save方法,并使用$ promise.then()来检查成功和错误:

myApp.controller('MessageController', ['$scope', 'messageRepository', '$location', '$timeout',
    function ($scope, messageRepository, $location, $timeout) {

    $scope.errors = [];

    $scope.save = function (message) {

            $scope.sendingdata = true;

            accountRepository.save(message).$promise.then(
                // handle success
                function (data) {


                },
                // handle error
                function (response) {
                       $scope.errors = response.data;   
                });
        };

    }])

如何在控制器的成功处理函数中访问响应位置标题?

1 个答案:

答案 0 :(得分:0)

您需要将成功函数传递给将方头作为参数的save方法。试试这个:

myApp.factory("messageRepository", ['$resource', function ($resource) {

    return {       
        save: function(message) {
            return $resource('/api/messages').save(message, function(value, responseHeaders) {
                       return responseHeaders().Location;
            });
        }
    };

}]);