如何在MVC的局部视图中返回json?

时间:2012-05-28 09:23:06

标签: c# asp.net-mvc json asp.net-mvc-3 jsonresult

我有以下代码:

[HttpPost]
public JsonResult Index2(FormCollection fc)
{
    var goalcardWithPlannedDate = repository.GetUserGoalCardWithPlannedDate();
    return Json(goalcardWithPlannedDate.Select(x => new GoalCardViewModel(x)));
}

但是我想在部分视图中使用它,我该怎么做?

2 个答案:

答案 0 :(得分:2)

如果我正确理解您的需求,您可以尝试以下

public JsonResult Index2(FormCollection fc)
{
    var goalcardWithPlannedDate = repository.GetUserGoalCardWithPlannedDate();
    return Json(goalcardWithPlannedDate.Select(x => new GoalCardViewModel(x)), "text/html", JsonRequestBehavior.AllowGet);
}

设置c内容类型很重要,因为如果使用Html.RenderAction调用此操作,JsonResult将覆盖整个响应的内容类型。这不是一个好的解决方案,但在某些情况下有效。

相反,您也可以尝试更好的解决方案:

var scriptSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var jsonString = scriptSerializer.Serialize(goalcardWithPlannedDate.Select(x => new GoalCardViewModel(x)));

然后,您可以使用字符串表示执行所需的一切。它实际上是JsonResult内部所做的事情。顺便说一句,同样的成功,你可以在这里使用任何json序列化器。

如果您想在客户端访问它。您无需更改代码。如果使用jQuery:

$.post('<%= Url.Action("Index2") %>', { /* your data */ }, function(json) { /* actions with json */ }, 'json')

如果您想将其传递给视图模型,请:

[HttpPost]
public ActionResult Index2(FormCollection fc)
{
    var goalcardWithPlannedDate = repository.GetUserGoalCardWithPlannedDate();
    return PartialView(new MyModel { Data = goalcardWithPlannedDate.Select(x => new GoalCardViewModel(x)) });
}

答案 1 :(得分:0)

您还可以返回部分View而不是Json。

[HttpPost]
public ActionResult Index2(FormCollection fc)
{
   var goalcardWithPlannedDate = repository.GetUserGoalCardWithPlannedDate();
   return PartialView(goalcardWithPlannedDate.Select(x => new GoalCardViewModel(x)));
}