在C#的得到資料要給AngularJs使用時發生錯誤:序列化 '類型名稱' 型別的物件時偵測到循環參考。

  • 5564
  • 0
  • 2013-09-15

摘要:在C#的得到資料要給AngularJs使用時發生錯誤:序列化 '類型名稱' 型別的物件時偵測到循環參考。

【在Asp.Net MVC中練習使用AngularJs
public ActionResult Index()
{
        var user = _db.UserProfile.ToList();
        return View(user.ToList());
}
 
傳到view時因為資料要給AngularJs$scope使用,所以要轉成json格式,因此:
var userData = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model);
但是發生錯誤:
序列化 'System.Data.Entity.DynamicProxies.UserProfile_CEE82D32FCD691626A61F42769FECEA9AB07909986AD7E4D856A9F08F03065F4' 型別的物件時偵測到循環參考。
看起來在物件層級中有循環參考(某個欄位參考另一個資料表),因此要選擇要用的欄位,且非導覽欄位,完整程式如下:
 
@model IEnumerable<HappyMovieAngularJs.Models.UserProfile>
@{
    var user = Model.Select(x => new { x.UserId, x.NickName, x.UserName });
    var userData = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(user);
}
<script>
    var myApp = angular.module('myApp', []);
    myApp.controller('AppCtrl', function ($scope) {
        $scope.users = JSON.parse('@Html.Raw(userData)');
    });
</script>
<div data-ng-app="myApp">
    <div data-ng-controller="AppCtrl">
        <table>
            <tr data-ng-repeat="user in users">
                <td>{{user.UserId}}</td>
                <td>{{user.NickName}}</td>
                <td>{{user.UserName}}</td>
            </tr>
        </table>
    </div>
</div>