I\'ve been happily returning JsonResult objects or partial ASP.NET views from my controllers in ASP.NET.
I would like to return a rendered partial view as a property
Here is some code that will work cause I needed to do this today. The original code is described here.
public static string RenderPartialToString(string controlName, object viewData)
{
var viewContext = new ViewContext();
var urlHelper = new UrlHelper(viewContext.RequestContext);
var viewDataDictionary = new ViewDataDictionary(viewData);
var viewPage = new ViewPage
{
ViewData = viewDataDictionary,
ViewContext = viewContext,
Url = urlHelper
};
var control = viewPage.LoadControl(controlName);
viewPage.Controls.Add(control);
var sb = new StringBuilder();
using (var sw = new StringWriter(sb))
using (var tw = new HtmlTextWriter(sw))
{
viewPage.RenderControl(tw);
}
return sb.ToString();
}
You can then use it to do RJS style json results
public virtual ActionResult Index()
{
var jsonResult = new JsonResult
{
Data = new
{
main_content = RenderPartialToString("~/Views/contact/MyPartial.ascx", new SomeObject()),
secondary_content = RenderPartialToString("~/Views/contact/MyPartial.ascx", new SomeObject()),
}
};
return Json(jsonResult, JsonRequestBehavior.AllowGet);
}
And the partial has a strongly typed view model
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeObject>" %>
<h1>My Partial</h1>
Something like:
return new JsonResult { Data = new { PostId = 1; Html = "<p>some markup rendered from a partial to inject</p>" } };
I was looking for a better way to do this myself because I assumed the way I was doing it was outdated. I forget where I got this and take no credit for it, but since I ended up here I figure I'll post what I use as well. Hope it helps anyone coming along looking for something newer than the answers above.
** NOTE This only addresses the rendering of the view to a string. The answers above address the question about putting the result into a property on a JSON object and the OP seemed pretty comfortable with that anyway.
public string RenderViewToString(string viewName, object model)
{
ViewData.Model = model;
using (var sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
return sw.GetStringBuilder().ToString();
}
}