Skip to content

Instantly share code, notes, and snippets.

@adnanzameer
Last active December 21, 2020 16:42
Show Gist options
  • Save adnanzameer/ff96a6138502adae1b7666e1c707cbb4 to your computer and use it in GitHub Desktop.
Save adnanzameer/ff96a6138502adae1b7666e1c707cbb4 to your computer and use it in GitHub Desktop.
Get HTML String from PageData in Episerver
using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.UI;
/// <summary>
/// Shamelessly "inspired" by classes in System.Web.Mvc assembly
/// It appears that only a System.Web.UI.Page can be executed
/// as a child request. If you try to execute an MvcHandler
/// directly an exception (with no detail) is thrown
/// </summary>
internal class ChildActionHandler : Page, IHttpAsyncHandler
{
internal class ChildActionMvcHandler : MvcHandler
{
public ChildActionMvcHandler(RequestContext context)
: base(context)
{
}
protected override void AddVersionHeader(HttpContextBase httpContext)
{
}
}
private readonly ChildActionMvcHandler mvcHandler;
public ChildActionHandler(RequestContext context)
{
this.mvcHandler = new ChildActionMvcHandler(context);
}
public override void ProcessRequest(HttpContext context)
{
((IHttpHandler)this.mvcHandler).ProcessRequest(context);
}
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
return ((IHttpAsyncHandler)this.mvcHandler).BeginProcessRequest(context, cb, extraData);
}
public void EndProcessRequest(IAsyncResult result)
{
((IHttpAsyncHandler)this.mvcHandler).EndProcessRequest(result);
}
}
using System.Globalization;
using System.IO;
using System.Web.Routing;
using EPiServer.Core;
using EPiServer.Web;
using EPiServer.Web.Routing;
public class MvcPageDataRenderer
{
private readonly TemplateResolver templateResolver;
public MvcPageDataRenderer(TemplateResolver templateResolver)
{
this.templateResolver = templateResolver;
}
public string ExecuteChildRequest(RequestContext existingRequestContext, PageData pageToRender, string preferredLanguageToRender)
{
var templateModel = this.templateResolver.ResolveMvcTemplate(existingRequestContext.HttpContext, pageToRender);
existingRequestContext.SetController(templateModel.TemplateType.Name.Replace("Controller", string.Empty));
existingRequestContext.SetControllerType(templateModel.TemplateType);
existingRequestContext.SetContentLink(pageToRender.ContentLink);
existingRequestContext.SetRoutedData(pageToRender);
existingRequestContext.SetContextMode(ContextMode.Default);
existingRequestContext.RouteData.Values["action"] = "Index";
existingRequestContext.RouteData.DataTokens["namespaces"] = new[] { templateModel.TemplateType.Namespace };
if (!string.IsNullOrWhiteSpace(preferredLanguageToRender))
{
existingRequestContext.SetLanguage(preferredLanguageToRender);
EPiServer.BaseLibrary.Context.Current["EPiServer:ContentLanguage"] = new CultureInfo(preferredLanguageToRender);
}
var handler = new ChildActionHandler(existingRequestContext);
using (var stringWriter = new StringWriter(CultureInfo.CurrentCulture))
{
existingRequestContext.HttpContext.Server.Execute(handler, stringWriter, true);
return stringWriter.ToString();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment