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:
@{
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>
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.