IHtmlHelper does not contain a definition for 'RenderAction' error

Viewed 61

I'm migrating my ASP .NET MVC app from .NET Framework 4.8 to .NET 6 and have encountered problem that Html.RenderAction method from System.Web.Mvc.Html namespace no longer works and I'm getting an error in my code:

if (Model.IsCrawler)
{
Html.RenderAction("GetLanguageSelector", "languageSelectorAsync", new { brand = Model.Layout.BrandShortName, cultureInfo = Model.CurrentPage.CurrentLanguage });
}

This method is accessing LanguageSelectorAsyncController:

public class LanguageSelectorAsyncController : Microsoft.AspNetCore.Mvc.Controller
   {
       private readonly IContentLoader contentLoader;
       private readonly IContentLanguageAccessor contentLanguageAccessor;

       public LanguageSelectorAsyncController(
           IContentLoader contentLoader, IContentLanguageAccessor contentLanguageAccessor)
       {
           this.contentLoader = contentLoader;
           this.contentLanguageAccessor = contentLanguageAccessor;
       }

       public Microsoft.AspNetCore.Mvc.ActionResult GetLanguageSelector(string brand, CultureInfo cultureInfo)
       {
           contentLanguageAccessor.Language = cultureInfo;
           HomePage homePage = ContentReference.StartPage.Get<HomePage>();
           if (homePage?.SiteSettingsLink != null)
           {
               SiteSettings settingsPage = contentLoader.Get<SiteSettings>(homePage.SiteSettingsLink, cultureInfo) ?? contentLoader.Get<SiteSettings>(homePage.SiteSettingsLink);

               if (settingsPage != null)
               {
                   if (brand == "rockstar")
                   {
                       return PartialView("Content/BrandSelectorBlock", settingsPage.RockstarLanguageSelector);
                   }
                   else if (brand == "green")
                   {
                       return PartialView("Content/BrandSelectorBlock", settingsPage.GreenLanguageSelector);
                   }
                   else if (brand == "rockfon")
                   {
                       return PartialView("Content/BrandSelectorBlock", settingsPage.RockfonLanguageSelector);
                   }
                   else if (brand == "rockpanel")
                   {
                       return PartialView("Content/BrandSelectorBlock", settingsPage.RockpanelLanguageSelector);
                   }
                   else if (brand == "lapinus")
                   {
                       return PartialView("Content/BrandSelectorBlock", settingsPage.LapinusLanguageSelector);
                   }
                   else if (brand == "language")
                   {
                       return PartialView("Content/LanguageSelectorBlock", settingsPage.LanguageSelector);
                   }
               }
           }

           return null;
       }
   }

...which in turn uses views BrandSelectorBlock:

@model BrandSelectorBlock
@{
    var list = Model.Continents;
    var tabs = list.Item1;
    var tabCount = "has-" + tabs.Count() + "-tabs";
    var NoEurope = string.IsNullOrWhiteSpace(tabs.Where(x => x.Equals(Continents.Europe)).FirstOrDefault());
    TempData.AddStyles(OrganismStyle.O23Tabs);
    TempData.AddOrganismScripts(ViewScript.O23TabsView);
}

<header class="modal-multi-selector__header">
    <div class="container">
        <button type="button" class="modal-multi-selector__close js-lang__close"></button>

        @if (!string.IsNullOrWhiteSpace(Model.BrandLogo))
        {
            <figure class="modal-multi-selector__logo">
                
                    @SvgHelper.GetSVG(Model.BrandLogo)
                
            </figure>
        }
        <div class="modal-multi-selector__description">
            <p class="body-text-2">@Html.ExtendedPropertyFor(x => x.BodyText)</p>
            <p class="body-text-2 is-hidden">@Html.ExtendedPropertyFor(x => x.VisitorMessage)</p>
        </div>
        <h3 class="modal-multi-selector__title">@Html.ExtendedPropertyFor(x => x.Heading)</h3>
    </div>
    <div class="O23-tabs @tabCount is-filter">
        <nav class="O23-tabs__nav">
            <div class="container">
                <ul class="O23-tabs__list is-hidden-sm">
                    @for (var i = 0; i < tabs.Count(); i++)
                    {
                        var tab = tabs.ElementAt(i);
                        var isActive = "";
                        if (tab.ToLower().Equals(Continents.Europe.ToLower()) || (NoEurope && i == 0))
                        {
                            isActive = "is-active";
                        }
                        <li class="O23-tabs__item @isActive">
                            <span>@tab</span>
                        </li>
                    }

                    <li class="O23-tabs__list__indicator"></li>
                </ul>

                <div class="O23-tabs__select is-hidden-md">
                    <div class="select">
                        <div class="select__wrap">
                            <div class="select__wrap__elem">
                                <select class="select__elem js-select" name="countries">
                                    @for (var i = 0; i < tabs.Count(); i++)
                                    {
                                        var tab = tabs.ElementAt(i);
                                        var selected = "";
                                        if (tab.Equals(Continents.Europe) || (NoEurope && i == 0))
                                        {
                                            selected = "selected";
                                        }
                                        <option @selected value="@tab.ToLower()">@tab</option>
                                    }
                                </select>
                            </div>

                            
                                @SvgHelper.GetSVG("small-arrow-down")
                            
                        </div>
                    </div>
                </div>
            </div>
        </nav>
    </div>
</header>

<div class="modal-multi-selector__content">
    <div class="modal-multi-selector__content__inner">
        <div class="container">
            <ul class="modal-multi-selector__list">
                @foreach (var langItem in list.Item2)
                {
                    <li class="modal-multi-selector__item" data-country-code="@langItem.CountryCode.ToLower()" data-filter="@langItem.Continent.ToLower()"><a href="@langItem.Link">@langItem.DisplayString</a></li>
                }
            </ul>
        </div>
    </div>
</div>

And LanguageSelectorBlock:

@model LanguageSelectorBlock
@{
    var list = Model.Continents;
    var tabs = list.Item1;
    var tabCount = "has-" + tabs.Count() + "-tabs";
    TempData.AddOrganismScripts(ViewScript.O23TabsView);
}
<header class="modal-multi-selector__header">
    <div class="container">
        <button type="button" class="modal-multi-selector__close js-lang__close"></button>

        @if (!string.IsNullOrWhiteSpace(Model.BrandLogo))
        {
            <figure class="modal-multi-selector__logo">
                
                    @SvgHelper.GetSVG(Model.BrandLogo)
                
            </figure>
        }

        <h3 class="modal-multi-selector__title">@Model.Heading</h3>
    </div>

    <div class="O23-tabs @tabCount is-filter">
        <nav class="O23-tabs__nav">
            <div class="container">
                <ul class="O23-tabs__list is-hidden-sm">
                    @for (var i = 0; i < tabs.Count(); i++)
                    {
                        var tab = tabs.ElementAt(i);
                        var isActive = "";
                        if (i == 0)
                        {
                            isActive = "is-active";
                        }
                        <li class="O23-tabs__item @isActive">
                            <span>@tab</span>
                        </li>
                    }

                    <li class="O23-tabs__list__indicator"></li>
                </ul>

                <div class="O23-tabs__select is-hidden-md">
                    <div class="select">
                        <div class="select__wrap">
                            <div class="select__wrap__elem">
                                <select class="select__elem js-select" name="countries">
                                    @for (var i = 0; i < tabs.Count(); i++)
                                    {
                                        var tab = tabs.ElementAt(i);
                                        var selected = "";
                                        if (i == 0)
                                        {
                                            selected = "selected";
                                        }
                                        <option @selected value="@tab.ToLower()">@tab</option>
                                    }
                                </select>
                            </div>

                            
                                @SvgHelper.GetSVG("small-arrow-down")
                            
                        </div>
                    </div>
                </div>
            </div>
        </nav>
    </div>

</header>

<div class="modal-multi-selector__content">
    <div class="modal-multi-selector__content__inner">
        <div class="container">
            <ul class="modal-multi-selector__list">

                @foreach (var langItem in list.Item2)
                {
                    var active = langItem.CountryCode.Equals(ContentLanguage.PreferredCulture.Name, StringComparison.OrdinalIgnoreCase)
                    ? "is-active" : "";
                    <li class="modal-multi-selector__item @active" data-filter="@langItem.Continent.ToLower()"><a href="@langItem.Link">@langItem.DisplayString</a></li>
                }
            </ul>

            <div class="modal-multi-selector__more">
                @Html.ExtendedPropertyFor(x => x.MoreInfoButton)
            </div>
        </div>
    </div>
</div>

I have tried using Html.PartialAsync and Html.RenderPartialAsync methods, but they aren't quite like for like replacement for Html.RenderAction and so did not work. I have also read about ViewComponents, but I don't know how to implement them in my code.

0 Answers
Related