Returning a rendered HTML partial in a JSON Property in ASP.NET MVC

前端 未结 3 491
灰色年华
灰色年华 2020-12-18 10:39

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

相关标签:
3条回答
  • 2020-12-18 11:00

    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>
    
    0 讨论(0)
  • 2020-12-18 11:04

    Something like:

    return new JsonResult { Data = new { PostId = 1; Html = "<p>some markup rendered from a partial to inject</p>" } };
    
    0 讨论(0)
  • 2020-12-18 11:06

    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();
            }
        }
    
    0 讨论(0)
提交回复
热议问题