Как я могу отправить параметры в свой http-запрос с помощью AngularJS?

Я использую следующий код:

$http({
    method: 'GET',
    url: '/Admin/GetTestAccounts',
    data: { applicationId: 3 }
}).success(function (result) {
    $scope.testAccounts = result;
});

Код отправляет на мой сервер следующее:

http://127.0.0.1:81/Admin/GetTestAccounts

Когда это будет получено моим контроллером MVC:

[HttpGet]
public virtual ActionResult GetTestAccounts(int applicationId)
{
    var testAccounts =
        (
            from testAccount in this._testAccountService.GetTestAccounts(applicationId)
            select new
            {
                Id = testAccount.TestAccountId,
                Name = testAccount.Name
            }
        ).ToList();

    return Json(testAccounts, JsonRequestBehavior.AllowGet);
}

Он жалуется, что нет приложения.

Словарь параметров содержит нулевую запись для параметра 'applicationId' типа, отличного от nullable 'System.Int32' для метода

Может кто-нибудь объяснить, почему приложение не отправляется в качестве параметра? Раньше я делал это со следующим кодом Angular, и он работал нормально:

$.ajax({
    url: '/Admin/GetTestAccounts',
    data: { applicationId: 3 },
    type: 'GET',
    success: function (data) {
        eViewModel.testAccounts(data);
    }
});

Ответ 1

Если вы не хотите использовать jQuery $.param, вы можете использовать поле параметра $http, которое сериализует объект.

var params = {
    applicationId: 3
}

$http({
    url: '/Admin/GetTestAccounts',
    method: 'GET',
    params: params
});

Ответ 2

Хорошо, я постараюсь ответить на это.

Я думаю, что проблема заключается в том, что angularjs предполагают, что данные, переданные в http, будут urlencoded. Я не уверен, почему angular не сериализует его неявно, если есть объект. Поэтому вы должны сами его закодировать:

 $http({
       method: 'GET',
       url: '/Admin/GetTestAccounts',
       data: 'applicationId=3'
       })

или используйте параметр jQuery для его кодирования:

$http({
     method: 'GET',
     url: '/Admin/GetTestAccounts',
     data: $.param({ applicationId: 3 })
     })