Last active
December 21, 2020 16:42
-
-
Save adnanzameer/ff96a6138502adae1b7666e1c707cbb4 to your computer and use it in GitHub Desktop.
Get HTML String from PageData in Episerver
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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