0

timeline.js + MVC + Ajax + JSON

こんにちは、

文字列を Json オブジェクトに変換中に問題が発生しました

Web ページにタイムラインを表示する必要があります。同じために Timeline.js を使用しました。次のような静的データを使用してタイムラインを実行できます。

静的データ

// Create a JSON data table
data = [
{
        'start': new Date(2010, 7, 23),
    'content': 'Conversation'
},
{
    'start': new Date(2010, 7, 23),
    'content': 'New Conversation'
},
{
    'start': new Date(2010, 7, 23),
    'content': 'Very New Conversation'
}

今私がするとき

alert(data);

それは私に与えます

[object Object],[object Object],[object Object]

しかし、今はDBからデータを表示する必要があるため、コントローラーで次の関数を呼び出しています

コントローラーの GetTimeLine メソッド

public JsonResult GetTimeline()
{
      JsonResult jr = new JsonResult();
      var objtimeline = objEntities.Timelines.Where(tl => tl.StudentID == Sessions.StudentID).ToList().AsQueryable();
      String newstr = "[";
      foreach(var tml in objtimeline)
      {
            DateTime date1 = Convert.ToDateTime(tml.CalculatedDate);
            newstr += "{'start': new  Date("+date1.Year+","+date1.Month+","+date1.Day+","+date1.Hour+","+date1.Minute+","+date1.Second+"),'content':'"+tml.Description+"'},";
      }
      newstr = newstr.TrimEnd(',');
      newstr += "];";
      jr.Data = newstr;
      jr.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
      return jr;
}

コントローラーメソッドを呼び出す関数

jQuery.ajax({
    type: "POST",
    url: "@Url.Content("~/Student/GetTimeline")",
    success: function (result) {
        data = result;
    },
});
alert(data);

次のアラートが表示されます

[{'start': new Date(2012,2,11,0,0,0),'content':'Parents meeting'},{'start': new Date(2012,2,15,0,0,0),'content':'Exam Meeting'}];

そのため、問題は文字列から Json オブジェクトへの変換にあります。

コントローラーから返された文字列をビューの Json オブジェクトに変換するにはどうすればよいですか...

4

2 に答える 2

4

あなたは働きすぎです。フレームワークに任せてください。

public JsonResult GetTimeline()
{
     var timeline = objEntities.TimeLines.Where( tl => tl.StudentID == Sessions.StudentID )
                                         .ToList() //required due to Convert call
                                         .Select( tl => new
                                          {
                                               start = Convert.ToDateTime(tl.CalculatedDate),
                                               content = tl.Description
                                          });
     return Json( timeline, JsonRequestBehavior.AllowGet );
}

次に、getJSON(取得を明確に許可しているため) を使用するかdataType: 'json'、リクエストで指定します。

$.getJSON( '@Url.Action("gettimeline","student")', function(data) {
     alert(data);
});
于 2012-04-14T13:25:18.713 に答える
1

サーバーが返すものは有効なJSONではありません。または、サーバー側のコードを指定すると、オブジェクト グラフではなく文字列を定義するだけの有効な JSON である可能性があります。JSON の場合:

  • すべてのオブジェクト キーは、一重引用符ではなく二重引用符で囲む必要があります。
  • すべての文字列は、一重引用符ではなく二重引用符で囲む必要があります。
  • new Date(...)は無効です (JSON には日付の概念がありません)。

配列 (文字列ではなく) を作成して に割り当て、オブジェクトjr.Dataにシリアル化を処理させたいと考えています (ただし、ASP.net MVC ではこれを行っていません)。JsonResult

サーバーから有効な JSON が返されたら、正しいContent-Typeヘッダー (値はapplication/json) で返されていることを確認します。そうすると、jQuery はそれが JSON であることを認識し、それをオブジェクト グラフに逆シリアル化します。サーバーが有効な JSON を返せない、または返したくない場合は、強制的に呼び出しに追加dataType: 'json'します。ajax

于 2012-04-14T13:17:41.697 に答える