Asp.net MVC: Send back HTML inside Json object Asp.net MVC: Send back HTML inside Json object json json

Asp.net MVC: Send back HTML inside Json object


Is http://craftycodeblog.com/2010/05/15/asp-net-mvc-render-partial-view-to-string/ what you're looking for?

Copied using the WayBackMachine.

I have run into a situation where I would like to render a partial view to a string and then return it as part of a JSON response like so:

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

The ability to do something like this would open up a ton of amazing possibilities, so I really scoured the internet looking for a solution. Unfortunately, no one seems to have come up with a clean solution for it, so I dug into the MVC code and came up one…and because I’m such a nice guy, you get to copy it for free. ;)

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

Now you can simply do this:

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

Also note that you can modify these functions to render a View (rather than a PartialView) with this small change:

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

Enjoy!


PartialView returns a PartialViewResult docs and that is what gets encoded to JSON.

Look at http://forums.asp.net/post/3761391.aspx on how to render the PartialView to a string