Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • Stephen 6 posts 96 karma points
    Nov 06, 2019 @ 12:57
    Stephen
    0

    Umbraco 8 - getting umbraco-based information into WebForms legacy page

    Hi folks

    I'm building a new Umbraco 8 site based on a much older WebForms site. Most of the site is being rebuilt in MVC with proper Umbraco integration, but there are a couple of legacy pages which, for the moment, need to stay as WebForms pages - we just do not have the resources to rebuild them. I've been asked to see if we can incorporate the Umbraco-based Header and Footer views into the WebForms aspx pages in some fashion.

    I just need to be able to pull a few facets of the HomePage ContentModel in - a list of its Children to construct the same set of top links as is in the MVC pages, and one of the properties of its IPublishedContent so that I can get the URL of a banner image. Is there any way at all that I can access Umbraco.ContentAtRoot() or the general UmbracoViewPage structure from within an aspx context? Can I get the information directly from Umbraco's SQL database tables?

    Thanks

  • Stephen 6 posts 96 karma points
    Nov 13, 2019 @ 13:43
    Stephen
    100

    I eventually solved this one myself with help from Google.

    For anyone else stuck with the same issue, if you include

    using Umbraco.Web.Composing;
    

    you can then access

    Current.UmbracoHelper.ContentAtRoot().FirstOrDefault()
    

    to make use of the homepage. I was then able to use a slightly modified version of Keith's answer from https://stackoverflow.com/questions/702746, melded with aarondcoleman's answer, to render the partial view as a string that I could then include in the WebForms page.

    public static string RenderPartial(string partialName, object model)
        {
            //get a wrapper for the legacy WebForm context
            var httpCtx = new HttpContextWrapper(HttpContext.Current);
    
            //create a mock route that points to the empty controller
            var rt = new RouteData();
            rt.Values.Add("controller", "WebFormController");
    
            //create a controller context for the route and http context
            var ctx = new ControllerContext(new RequestContext(httpCtx, rt), new WebFormController());
    
            //find the partial view using the viewengine
            var view = ViewEngines.Engines.FindPartialView(ctx, partialName).View;
    
            //create a view context and assign the model
            var vctx = new ViewContext(ctx, view, new ViewDataDictionary { Model = model }, new TempDataDictionary(), new StringWriter());
    
            // This will render the partial view direct to the output, but be careful as it may end up outside of the <html /> tag
            //view.Render(vctx, HttpContext.Current.Response.Output);
    
            // Better to render like this and create a literal control to add to the parent
            var html = new StringWriter();
            view.Render(vctx, html);
            return html.GetStringBuilder().ToString();
        }
    

    and then in the code-behind Page_Load function,

    HeaderContent = WebFormMVCUtil.RenderPartial("~/Views/Partials/WebFormsCustomHeader.cshtml", Current.UmbracoHelper.ContentAtRoot().FirstOrDefault());
    

    (HeaderContent being declared as a public string in the partial class of the page)

    (Incidental note, when I put

    <%= HeaderContent %>
    

    into the code of the aspx page, I initially got an error from Visual Studio that it couldn't find HeaderContent, but the error vanished once I compiled and actually ran the page, so I think that was just Visual Studio being weird.)

  • This forum is in read-only mode while we transition to the new forum.

    You can continue this topic on the new forum by tapping the "Continue discussion" link below.

Please Sign in or register to post replies