Click here to Skip to main content
15,867,704 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hello, 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:

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


This method is accessing LanguageSelectorAsyncController:
C#
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:
C#
@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:
C#
@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>


What I have tried:

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.
Posted
Updated 25-Jan-23 12:10pm

In .NET Core/5/6, the RenderAction method has been replaced with "view components":
View components in ASP.NET Core | Microsoft Docs[^]
 
Share this answer
 
I am confused, why can't we use the HtmlHelperViewExtensions.RenderAction() in namespace Microsoft.AspNetCore.Mvc.Rendering ?
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900