2010-01-18 135 views
0

最近似乎我最近似乎发布的是带有JSON的ASP.NET MVC - 你会认为我现在要学习!然而,奇怪的事情仍在发生,我无法解释!ASP.NET MVC返回JSON对象的ViewModels

我有一个返回JsonResult一个控制器方法:

public JsonResult GetAllUserTasksForStage(int StageID, string Username) 
{ 
    var uM = ManagerProvider.GetUserManager(); 
    var tM = ManagerProvider.GetTaskManager(); 
    var tasks = tM.GetAllUserTasks(StageID, uM.GetUser(Username).ID); 
    // GetAllUserTasks returns IEnumerable<TaskViewModel> 
    // Encode this into Json and return it 
    return Json(tasks, JsonRequestBehavior.AllowGet); 
} 

此方法成功完成,但是当涉及到接收这个在我看来,问题的出现。我已经尝试使用$ .post(...)和$ .getJSON(...) - $ .post()我从Controller方法中删除了JsonRequestBehavior。

阅读jQuery文档我已经看到,$ .post和$ .getJSON的回调函数只会在结果是有效的JSON时触发 - 这导致我相信GetAllUserTasksForStage的返回结果有问题。

的TaskViewModel类定义为:

public class TaskViewModel 
{ 
    public int ID { get; set; } 
    public UserViewModel Assignee { get; set; } 
    public DateTime Created { get; set; } 
    public UserViewModel Creator { get; set; } 
    public DateTime Due { get; set; } 
    public string TaskDescription { get; set; } 
    public string TaskTitle { get; set; } 
    public bool Completed { get; set; } 
    public StageViewModel Stage { get; set; } 
    public IEnumerable<TaskAuditViewModel> TaskAudits { get; set; } 
} 

它是完全难倒我,因为我用$。员额,并没有任何问题在同一个浏览几次$ .getJSON - 但从未返回TaskViewModel。

任何想法?

感谢,

克里斯

+0

“出现问题”?你能更具体些吗?您是否在Firebug或Fiddler中检查过JSON? – 2010-01-18 13:33:11

+0

$中给出的回调函数。post()和$ .getJSON不会触发,这意味着返回无效的JSON - 但我不知道它为什么是无效的JSON。 – Chris 2010-01-18 13:46:57

+0

您需要指定正在生成的错误类型,以便任何人充分评论问题的可能性。 – Israfel 2010-01-18 13:47:16

回答

0

我建议打破的问题了一点。发生的事情太多了。首先尝试返回一个简单的JSON对象。这将允许您确保JavaScript /传输是正确的。然后尝试慢慢地将您的对象作为返回类型。通过这种方式,您可以自行确定JSON无效的位置。

0

尝试直接从浏览器URL调用您的Json方法(跳过jQuery部分)并查看所得结果。我猜测你可能有一些像jQuery ajax调用这个动作的东西。所以请尝试直接调用它。这通常会显示简单的错误消息。

0

您的模型很复杂(它包含其中的其他模型)。

我没有事实,但似乎MVC中的Json函数在将复杂模型传递给JQuery部分时存在问题。如果您检查mvc动作(Json所在行上的F9)的结果,您可以看到Json按照以下部分映射复杂模型:base,Model1,Mode2,...

当这种情况发生时,Json返回一个映射结果,但不知怎的,clinet jQuery部分无法理解它,没有错误,但数据无法在客户端上使用。

我试过自己找到一个解决方案,但还没有找到。我尝试了几种像你一样的组合(.post,.get,.ajax ... JsonResult等等)。可惜的是,唯一的办法似乎工作正在恢复(从动作)手动创建的JSON结果是这样的:

[HttpPost] 
     public ActionResult GetOrderDetail(int id) 
     { 
      var orderDetail = orderService.GetOrderDetail(id); 

      var result = Json(new 
      { 
       ItemDescription = orderDetail.ItemDescription, 
       ItemUrl = orderDetail.ItemUrl 
      }); 

      return result; 
     } 

在这种情况下,我的模型的OrderDetail还有另外两个车型内:订单,OrderMessages,并有同样的问题如你所描述的。通过手动将属性映射到如下所示的属性,它可以工作。