0

时间线.js + MVC + Ajax + JSON

你好,

将字符串转换为 Json 对象时出现问题

我必须在我的网页上显示时间线,我也使用了 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]

但现在我必须显示来自数据库的数据,所以我在控制器上调用以下函数

控制器上的 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,然后让JsonResult对象为您处理序列化(但我在 ASP.net MVC 中没有这样做)。

让服务器返回有效 JSON 后,确保它返回正确的Content-Type标头(值为application/json)。当您这样做时,jQuery 将看到它是 JSON 并将其反序列化为您的对象图。如果您不能或不想让您的服务器返回有效的 JSON,请添加dataType: 'json'ajax调用以强制它。

于 2012-04-14T13:17:41.697 回答