【问题标题】:ASP.NET MVC Returning JSON Objects of ViewModelsASP.NET MVC 返回 ViewModel 的 JSON 对象
【发布时间】:2010-01-18 11:59:19
【问题描述】:

最近似乎我发布的所有内容似乎都是带有 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);
}

此方法成功完成,但是在我的视图上接收此方法时,出现了问题。我尝试同时使用 $.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; }
}

这完全把我难住了,因为我在同一个视图上多次使用 $.post 和 $.getJSON 都没有问题 - 但从未返回 TaskViewModel。

有什么想法吗?

谢谢,

克里斯

【问题讨论】:

  • “出现问题”?你能说得更具体一点吗?你检查过 Firebug 或 Fiddler 中的 JSON 吗?
  • $.post() 和 $.getJSON 中给出的回调函数没有触发,这意味着返回了无效的 JSON - 但我不知道为什么它是无效的 JSON。
  • 您需要指定正在生成的错误类型,以便任何人充分评论问题可能是什么。
  • 您是否尝试过关注 firebug 中返回的数据?
  • 感谢大家的cmets,我承认这个问题可以更好地表达。主要问题是回调函数没有触发 - 我已经通过不返回 IEnumerable 来证明这一点,而是让我自己的 Json 对象只包含我需要的值 - 这似乎目前有效。现在只是好奇困扰着我!

标签: jquery asp.net-mvc json


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      我没有事实,但似乎 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,并且与您描述的问题相同。通过将手动属性映射到此处所示的属性,它可以工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-22
        • 2016-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-24
        相关资源
        最近更新 更多