将另一个actionresult作为字符串返回

时间:2011-03-14 19:22:32

标签: asp.net-mvc-3 jsonresult

在我的MVC网站上,我正在创建一个小型论坛。对于一个帖子,我在我的“PostController”中呈现我的“单(帖子后)”动作,如下所示

<% Html.RenderAction<PostController>(p => p.Single(comment)); %>

此外,当用户回复帖子时,我将回复作为ajax请求发送到我的“CreatePost”操作,然后返回“单个”视图作为此操作的结果,如下所示

public ActionResult CreatePostForForum(Post post)
{
    //Saving post to DB
    return View("Single", postViewData);
}

当我确实只想渲染视图时,“单个”动作体中的代码不会被执行。

这样做的最佳方式是什么?

另外,我想在我的JsonObject中将“Single”动作结果作为字符串返回,如下所示

return Json(new{IsSuccess = true; Content= /*HERE I NEED Single actions result*/});

2 个答案:

答案 0 :(得分:0)

你可以使用这样的东西,但要非常小心。它实际上可能导致严重的可跟踪错误(例如,当您忘记在Single方法中显式设置视图名称时)。

public ActionResult Single(PostModel model) {
    // it is important to explicitly define which view we should use
    return View("Single", model);
}

public ActionResult Create(PostModel model) {

    // .. save to database ..

    return Single(model);
}

清洁解决方案的做法与从标准格式发布一样 - 重定向(XMLHttpRequest将遵循它)

为了返回包含在json中的ajax视图,我使用以下类

public class AjaxViewResult : ViewResult
{
    public AjaxViewResult()
    {

    }

    public override void ExecuteResult(ControllerContext context)
    {
        if (!context.HttpContext.Request.IsAjaxRequest())
        {
            base.ExecuteResult(context);
            return;
        }

        var response = context.HttpContext.Response;

        response.ContentType = "application/json";

        using (var writer = new StringWriter())
        {
            var oldWriter = response.Output;
            response.Output = writer;
            try
            {
                base.ExecuteResult(context);
            }
            finally
            {
                response.Output = oldWriter;
            }

            JavaScriptSerializer serializer = new JavaScriptSerializer();
            response.Write(serializer.Serialize(new
            {
                action = "replace",
                html = writer.ToString()
            }));
        }
    }
}

这可能不是最好的解决方案,但效果很好。请注意,您需要手动设置View,ViewData.Model,ViewData,MasterName和TempData属性。

答案 1 :(得分:0)

我的建议:

  • 通过Ajax发布您的论坛回复(以及任何选项)。
  • 使用以下方法返回您的JSONResult:ASP MVC View Content as JSON以呈现您的内容。
  • 在ajax调用的OnSuccess处理程序中,检查IsSuccess是否为true。如果成功,请使用JQuery将内容附加到适当的容器