2017-02-09 2 views
0

У меня есть метод GET в angularjs, который получает данные от контроллера API в C#. Контроллер возвращает данные, и метод $ http get получает ответ, но тело содержимого ответа пуст.

Моя HttpGet функция контроллера API:

[HttpGet] 
[Route("api/LandingPage/GetByDate")] 
public HttpResponseMessage GetByDate(DateTime startDate, DateTime endDate) 
{ 
    try 
    { 
     var startDateParam = new SqlParameter("@startDate", startDate); 
     var endDateParam = new SqlParameter("@endDate", endDate); 

     var confirmData = m_databaseObject.Database.SqlQuery<PageModel>("[dbo].[GetPageData] @startDate,@endDate", startDateParam, endDateParam).ToList(); 

     return Request.CreateResponse(HttpStatusCode.OK, confirmData); 
    } 
    catch (Exception e) 
    { 
     return Request.CreateErrorResponse(HttpStatusCode.NotFound, $"Error occured {e.Message} {startDate:yyyy-MM-dd} {endDate:yyyy-MM-dd}"); 
    } 
} 

Объект Я хочу вернуться:

public class PageModel 
{ 
    string Name { get; set; } 
    int? FirstTotal { get; set; } 
    int? FisrtInitial { get; set; } 
    int? FisrtApproval { get; set; } 
    int? SecondTotal { get; set; } 
    int? SecondInitial { get; set; } 
    int? SecondApproval { get; set; } 
    int? Validated { get; set; } 
    int? NotSettled { get; set; } 
} 

Метод GET:

this.getLandingPage = function ($scope) { 
    $scope.error = ""; 
    $scope.message = ""; 
    return $http({ 
     method: "GET", 
     url: apiName + "LandingPage/GetByDate?startDate=" + $scope.StartDate + "&endDate=" + $scope.EndDate, 
     headers: { 'Content-Type': 'application/json' } 
    }).success(function (data) { 
     if (data.length === 0) 
      $scope.message = "No Data found"; 
     else { 
      $scope.LandingPageData = data; 
     } 
    }).error(function (error) { 
     $scope.LandingPageData = null; 
     if (error) 
      $scope.error = error.Message; 
     else 
      $scope.error = "Data services may not be running, Please check!"; 
    }) 
} 

Моя confirmData переменная в мой контроллер содержит данные когда функция возвращается. Мой метод GET метода angularjs возвращает успех с data.length, равным 1, но нет значений, содержащихся в data.

Может ли кто-нибудь пролить свет на то, почему мои данные не передаются должным образом?

+0

Что внутри данных? Вы пытались «data.data»? –

+0

'data' содержит массив объектов размером 1 с пустым объектом –

+0

Вы отлаживали ваш контроллер и гарантировали, что confirmData имеет значение? –

ответ

1

Оказалось, что переменные класса PageModel необходимо объявить общедоступными, чтобы передавать данные с контроллера.

Изменение PageModel класс это работало:

public class PageModel 
{ 
    public string Name { get; set; } 
    public int? FirstTotal { get; set; } 
    public int? FisrtInitial { get; set; } 
    public int? FisrtApproval { get; set; } 
    public int? SecondTotal { get; set; } 
    public int? SecondInitial { get; set; } 
    public int? SecondApproval { get; set; } 
    public int? Validated { get; set; } 
    public int? NotSettled { get; set; } 
} 
0

Попытка вернуть JSON вместо HttpResponseMessage:

[HttpGet] 
[Route("api/LandingPage/GetByDate")] 
public JsonResult GetByDate(DateTime startDate, DateTime endDate) 
{ 
    try 
    { 
     var startDateParam = new SqlParameter("@startDate", startDate); 
     var endDateParam = new SqlParameter("@endDate", endDate); 

     var confirmData = m_databaseObject.Database.SqlQuery<PageModel>("[dbo].[GetPageData] @startDate,@endDate", startDateParam, endDateParam).ToList(); 

     return new JsonResult() { Data = confirmData , JsonRequestBehavior = JsonRequestBehavior.AllowGet }; 
    } 
    catch (Exception e) 
    { 
     throw; 
    } 
} 

На клиентской стороне ваши данные должны быть помещены в ответ data собственности. В вашем случае это должно быть:

data.data

Но, пожалуйста, попробуйте использовать функцию then Intead success функции:

.then(function (data) { 
     var result = data.data; 
    }); 

Даже вы можете избежать JsonResult и использовать string. Сериализуйте свою модель в строку JSON и возвращаемую строку.

+0

Я попытался использовать JsonResult, и у меня такая же проблема. –

+0

@KevinK. Попытайтесь использовать 'then' вместо' sucess'. – kat1330

0

Обычно данные вложены под свойством data.

.success(function (resp) { 
    if (resp.data.length === 0) 
     $scope.message = "No Data found"; 
    else { 
     $scope.LandingPageData = resp.data; 
    } 
}) 
+0

Когда я пытаюсь это сделать, я получаю 'resp.data' как undefined. –

+0

Что вы видите как ответ в сетевой консоли? –

+0

Код ответа - 200, а тело ответа - '[{}]' –

0

Какой тип углового использовать? От 1,6 .success устарела:

И любая конкретная причина, почему вы устанавливаете заголовок Content-Type? Вы можете использовать более простой способ:

return $http.get(url: apiName + "LandingPage/GetByDate?startDate=" + $scope.StartDate + "&endDate=" + $scope.EndDate,).then(successCallback, errorCallback); 

А затем определите функции обратного вызова отдельно.

Смежные вопросы