Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

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 in a JSON object. e.g.

requesting

/post/detail/1

would return

{"PostId": 1, "Html": "<p>some markup rendered from a partial to inject</p>" }

This would allow me to know the PostId when I am handling the response in JavaScript. Any tips on the best way to do this?

share|improve this question

2 Answers 2

up vote 8 down vote accepted

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>
share|improve this answer
    
Very nice. Thanks. –  Lance Fisher Feb 22 '10 at 15:11
    
+1 Nice solution Jake. Thanks for pointing out that my "answer" didn't work - like I said, at the time it was just an idea that I didn't have time to test. After you posted, I dug deeper & it was definitely a red herring (why the MVC team decided that View.Render(context, writer) should completely ignore the writer parameter & write straight to the Response stream is beyond me). I've removed it to cut down on the noise. My apologies if I wasted your time sending you down the wrong path. Next time I post code that logically looks like it should work, I'll actually test it first. :) –  Alconja Feb 22 '10 at 22:25
    
No Worries @Alconja - These are the kind of features that we should open with the mvc team on codeplex, get cats to vote and these problems would go away :) –  superlogical Feb 23 '10 at 1:22

Something like:

return new JsonResult { Data = new { PostId = 1; Html = "<p>some markup rendered from a partial to inject</p>" } };
share|improve this answer
    
Sounds like he knows how to use JsonResults, I think he's trying to combine a PartialView with a JsonResult... –  Alconja Jul 23 '09 at 0:15
    
Then the question is pretty poorly worded. –  rball Jul 23 '09 at 16:47
    
Yeah, I also think this is the correct answer (and was going to provide it) given the question... –  Pawel Krakowiak Jul 25 '09 at 11:10

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.