2015-06-11 3 views
0

Я использую angularjs в asp.net

Я сделал контроллер с CRUD и пытаюсь получить данные из angularjs контроллера с помощью $ службы HTTP

Маршрут PARAMS получает правильное querys из URL, я проверял это, но я получаю сообщение об ошибке неопределенной при запросе данных

что я делаю неправильно? :(

Метод SongsController.cs:

public ActionResult Index(string id) 
    { 
     /*var result = db.Songs.ToList(); 
     return Json(result, JsonRequestBehavior.AllowGet);*/ 

     string searchString = id; 
     var songs = from m in db.Songs 
        select m; 

     if (!String.IsNullOrEmpty(searchString)) 
     { 
      songs = songs.Where(s => s.Title.Contains(searchString)); 
     } 

     return Json(songs, JsonRequestBehavior.AllowGet); 
    } 

songsService.js:

myApp.factory('songsService', ['$http', function ($http) { 
var songsService = {}; 

songsService.getSongs = function (param) { 
    return $http.get('/Songs/Index/' + param); 
} 

return songsService;}]) 

songsController.js:

myApp.controller('songsController', ['$scope', '$routeParams', 'songsService', function ($scope, $routeParams, songsService) { 
var search = $routeParams.query; 
if (search == 'undefined' || search == null) 
    search = ''; 

getSongs(search); 
function getSongs(searchText) { 
    songsService.getSongs(searchText) 
     .success(function (data) { 
      $scope.songs = data; 
     }) 
     .error(function (error) { 
      $scope.status = 'Unable to load data: ' + error.message; 
      console.log($scope.status); 
     }); 
}}]); 

РЕДАКТИРОВАТЬ: класс песни:

using System; 
using System.Collections.Generic; 

    public class Song 
    { 
     public int ID { get; set; } 
     public string Title { get; set; } 
     public string Artist { get; set; } 

     public virtual ICollection<Navigation> Navigations { get; set; } 
    } 

EDIT2: Навигация Класс:

using System; 

public class Navigation 
{ 
    public int ID { get; set; } 
    public int SongID { get; set; } 
    public int PlaylistID { get; set; } 

    public virtual Song Song { get; set; } 
    public virtual Playlist Playlist { get; set; } 
} 

EDIT3: Если я называю мой .cs контроллер SongsController и перейти к URL песни/индекса/что-то я получаю всплывающее окно, если я хочу, чтобы открыть или сохранить something.json и просто попадаю обратно к моему URL по умолчанию, определяемой ngroute (#/песни /)

Но, если я назвать .cs контроллер что-то еще, как RandomController, если я перейти на тот же URL я получаю эту ошибку:

A circular reference was detected while serializing an object of type 'System.Data.Entity.DynamicProxies.Navigation_7A1A3B789B740F23BAB0A6DAABE519BE3A‌​F91C300893047C23FF2FD8C44E6705'.

EDIT4: Я пришел к точке, в которой все, если мой SongsController.cs выглядит следующим образом:

public ActionResult Index(string id) 
    { 
     var song = new List<Song> 
     { 
      new Song{Title="Paint It Black",Artist="Rolling Stones"}, 
      new Song{Title="People Are Strange",Artist="The Doors"}, 
      new Song{Title="With Or Without You",Artist="U2"}, 
      new Song{Title="Wish You Were Here",Artist="Pink Floyd"}, 
      new Song{Title="Fluorescent Adolescent",Artist="Arctic Monkeys"}, 
      new Song{Title="La Guitarra",Artist="Orjan Nilsen"}, 
      new Song{Title="Ping Pong",Artist="Armin Van Buuren"}, 
      new Song{Title="Fade Out Lines",Artist="The Avenger"}, 
      new Song{Title="Redemption Song",Artist="Bob Marley"}, 
      new Song{Title="Wherever I May Roam",Artist="Metallica"}, 
     }; 
     return Json(songs, JsonRequestBehavior.AllowGet);*/ 
    } 

Если это так все работает, но если это выглядит как я уже писал в оригинальном посте я получить неопределенную ошибку при запуске $ http.get:/

EDIT5: Хорошо, я считаю, проблема в том, что я пытаюсь отправить объекты, содержащие массив объектов класса навигации, как я могу это решить? :(

+0

Не могли бы вы поделиться своим классом 'Песни'? Вы проверили круглую ссылку? Кроме того, всегда полезно не возвращать объекты сущности сами, попробуйте сделать проекцию и/или класс модели для возвращаемых значений. – Fedaykin

+0

Я добавил класс Song, Songs является частью контекстного класса PlayerContext – intern

+0

Вы пытались выполнить запрос на получение независимо от Angular, просто скопировав и вставив URL-адрес в ваш браузер? Это что-то возвращает? Если не проблема, возможно, у вас нет надлежащей настройки маршрутизации в MVC: https://msdn.microsoft.com/en-us/library/cc668201.aspx – jstromwick

ответ

0

Вы циклическая ссылка на ваш Song классе.

Когда сериализатор Json пытается обработать его, он находит Navigations собственности и пытается сериализовать, что хорошо, проблема заключается в том, что каждый Navigation объекта на эта коллекция имеет экземпляр того же Song, поэтому он вводит бесконечный цикл, пытаясь его сериализовать все это снова и снова.

Это происходит потому, что EntityFramework имеет lazyloading и автоматически заполняет классы, когда сериализатор пытается получить к ним доступ .

Чтобы исправить это, вы можете сделать две вещи, просто отключить lazyloading для этого вызова, в частности:

public ActionResult Index(string id) 
{ 
    db.Configuration.LazyLoadingEnabled = false; 

    string searchString = id; 
    var songs = from m in db.Songs 
       select m; 

    if (!String.IsNullOrEmpty(searchString)) 
    { 
     songs = songs.Where(s => s.Title.Contains(searchString)); 
    } 

    return Json(songs, JsonRequestBehavior.AllowGet); 
} 

Другой вариант заключается в создании модели только данные, которые вы должны вернуться и заполнить его вручную (или с помощью инструмента отображения).

public ActionResult Index(string id) 
{ 
    db.Configuration.LazyLoadingEnabled = false; 

    string searchString = id; 
    var songs = from m in db.Songs 
       select m; 

    if (!String.IsNullOrEmpty(searchString)) 
    { 
     songs = songs.Where(s => s.Title.Contains(searchString)); 
    } 

    var mappedSongs = songs.Select(it => new { Title = it.Title, Artist = it.Artist }).ToList(); 

    return Json(mappedSongs , JsonRequestBehavior.AllowGet); 
} 
+0

Это очень помогло, спасибо! Я выбрал второй вариант и получил его работу :) – intern

+0

Рад, что я могу помочь – Fedaykin

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