Angular接收String作为数组?

时间:2014-09-10 17:12:33

标签: angularjs asp.net-web-api

我正在使用AngularJS和ASP.Net的Web API协同工作。我在API中有一个TestController,它很简单:

public class TestController : ApiController {
    [HttpGet]
    public String Ping() {
        return "Pong";
    }
}

在Chrome中,我可以转到http://localhost/api/Test/Ping,fiddler会显示一个简单的"Pong"结果,浏览器会显示:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Pong</string>

回到Angular JS,我设置了一个工厂来调用Ping函数:

app.factory('API', ['$resource', function ($resource) {
    return {
        Ping: function () {
            var result = $resource('api/Test/Ping', {}, { get: { method: 'GET' }, isArray: false });
            return result.get();
        }
    };
}]);

一个超级简单的控制器:

app.controller('MyCtrl', [ '$scope', 'API', function ($scope, API) {
    $scope.CallTest = function () {
        API.Ping().$promise.then(function (response) {
            alert(response);
        });
    }
}]);

当我点击CallTest绑定的按钮时,它会进行调用,API会返回Pong,但返回对象并不完全符合我的预期。回应是一个奇怪的对象:

{
    0: """,
    1: "P",
    2: "o",
    3: "n",
    4: "g",
    5: """,
    $promise: {...},
    $resolved: true
}

我没有收到任何错误,语法上的一切都运行良好。然而,我希望response是一个字符串,特别是因为我在isArray工厂中将API设置为false。我相信角度必须返回一个&#34;资源&#34;它上面有$promise$resolved,所以我现在明白它可能不会那样。除了在WebAPI中创建一个简单的包装器以返回字符串作为模型上的参数之外,是否有可用的客户端选项,以便response可以包含普通字符串而不是此伪数组?可能像response.data或其他什么?

编辑:当我从浏览器请求时,Accept标题包含:

text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

这导致上面的XML结果。当Angular请求相同的URL时,Accept标头包含:

application/json, text/plain, */*

这导致回复的内容只是"Pong"

2 个答案:

答案 0 :(得分:10)

如文档中所述,$resource工厂,它创建一个资源对象,允许您与REST服务器端数据源进行交互

在您的情况下,您没有尝试与正确的RESTful数据源进行交互,因此行为似乎很奇怪。

在您拥有正确的RESTful数据源并且只是想要访问API端点并检索简单响应(例如字符串)之前,您应该使用 $http service

$http.get('api/Test/Ping').success(function (data) {...})...

E.g:

app.factory('API', ['$http', function ($http) {
    return {
        Ping: function () {
            return $http.get('api/Test/Ping');
        }
    };
}]);

app.controller('MyCtrl', ['$scope', 'API', function ($scope, API) {
    $scope.CallTest = function () {
        API.Ping().success(function (data) {
            alert(data);
        });
    };
}]);

答案 1 :(得分:0)

如Angular存储库here中所述,当shallowClearAndCopy遍历键时,String文字将转换为对象。在我的例子中,将字符串文字传递给$ resource导致文字成为一个字符数组。我能够解决这个问题的第一种方法是将文字分配给变量并传递变量。

api.Trip.get(data.token) - Incorrect
api.Trip.get({token: data.token}) - Correct.

看到您来自Web API,这很可能需要您的响应作为JObject或JToken发送。我的Web API使用Newtonsoft的JSON.net库返回JObject,而Angular还没有跳过一个节拍。