ASP.NET MVC返回ViewModels的JSON对象

时间:2010-01-18 11:59:19

标签: jquery asp.net-mvc json

最近我似乎发布的所有内容都是带有JSON的ASP.NET MVC - 你会认为我现在已经学习了!然而,奇怪的事情不断发生,我无法解释!

我有一个返回JsonResult的Controller方法:

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);
}

此方法成功完成,但是在我的View上接收此方法时,会出现问题。我尝试使用$ .post(...)和$ .getJSON(...) - 对于$ .post()我从Controller方法中删除了JsonRequestBehavior。

阅读jQuery文档我已经看到,只要结果是有效的JSON,$ .post和$ .getJSON上的回调函数才会触发 - 这让我相信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; }
}

这完全困扰了我,因为我在同一个View上多次使用$ .post和$ .getJSON而没有任何问题 - 但从未返回TaskViewModel。

有什么想法吗?

谢谢,

克里斯

3 个答案:

答案 0 :(得分:0)

我建议稍微解决问题。发生的事太多了。首先尝试返回一个简单的JSON对象。这将允许您确保JavaScript /传输正确。然后尝试慢慢地将您的对象作为返回类型引入。这样您就可以自己确定JSON无效的位置。

答案 1 :(得分:0)

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

答案 2 :(得分: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内部还有另外两个模型:Order,OrderMessages,并且与您描述的问题相同。通过手动将属性映射到此处所示的属性,它可以正常工作。