Asp.net MVC:在Json对象中发回HTML

时间:2011-11-22 13:00:09

标签: jquery json asp.net-mvc-2

我想在我的json对象中返回html但是这似乎不起作用,我的代码:

return new JsonResult()
{
 Data = new { Error = false, NewComment = PartialView("Review/InlineCommentUC", dto) }
};

我希望NewComment里面有一些HTML ...

我以json格式收到的NewComment对象(使用firebug)是:

TempData = []
View = null,
ViewData = []
ViewEngineCollection = some data..
ViewName = name of view

我使用Jquery将输出呈现到html上,发送回json对象的原因是,所以我可以很容易地处理我的错误。

理想情况下,自定义操作结果就是我要找的......

2 个答案:

答案 0 :(得分:5)

http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/您要找的是什么?

使用WayBackMachine复制。

我遇到过一种情况,我希望将一个部分视图呈现给字符串,然后将其作为JSON响应的一部分返回,如下所示:

return Json(new {
    statusCode = 1,
    statusMessage = "The person has been added!",
    personHtml = PartialView("Person", person)
});

做这样的事情的能力会带来很多惊人的可能性,所以我真的在互联网上寻找解决方案。不幸的是,似乎没有人为它提出一个干净的解决方案,所以我挖掘了MVC代码并提出了一个...而且因为我是一个很好的人,你可以免费复制它。 ;)

public abstract class MyBaseController : Controller {

    protected string RenderPartialViewToString()
    {
        return RenderPartialViewToString(null, null);
    }

    protected string RenderPartialViewToString(string viewName)
    {
        return RenderPartialViewToString(viewName, null);
    }

    protected string RenderPartialViewToString(object model)
    {
        return RenderPartialViewToString(null, model);
    }

    protected string RenderPartialViewToString(string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
            viewName = ControllerContext.RouteData.GetRequiredString("action");

        ViewData.Model = model;

        using (StringWriter sw = new StringWriter()) {
            ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
            ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);

            return sw.GetStringBuilder().ToString();
        }
    }
}

现在你可以这样做:

public class MyController : MyBaseController {

    public ActionResult CreatePerson(Person p) {
        if (ModelState.IsValid) {
            try {
                PersonRepository.Create(p);
                return Json(new {
                    statusCode = 1,
                    statusMessage = "The person has been added!",
                    personHtml = RenderPartialViewToString("Person", p)
                });
            }
            catch (Exception ex) {
                return Json(new {
                    statusCode = 0,
                    statusMessage = "Error: " + ex.Message
                });
            }
        }
        else
            return Json(new {
                statusCode = 0,
                statusMessage = "Invalid data!"
            });
    }
}

另请注意,您可以使用以下小改动修改这些函数以呈现视图(而不是PartialView):

ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName);

享受!

答案 1 :(得分:1)

PartialView返回PartialViewResult docs,这就是编码为JSON的内容。

关于如何将PartialView呈现为字符串

,请查看http://forums.asp.net/post/3761391.aspx