MVC4 RenderAction вызывает переполнение стека в _Layout.cshtml

Я хочу реализовать меню в моем представлении _Layout.cshtml:

@Html.Partial("_LoginPartial")
@{ Html.RenderAction("Index", "Home"); }

@if (@ViewBag.Menus != null)
{
    foreach (vw_UsuarioPerfilMenuFuncionalidade memo in @ViewBag.Menus)
    {
        if (memo.IdMenuLast == null)
        {
            <li><span>@memo.NomeMenu</span></li>
            foreach (vw_UsuarioPerfilMenuFuncionalidade memo2 in @ViewBag.Menus)
            {
                if (memo.IdMenu == memo2.IdMenuLast)
                {
                    <li><span>@memo2.NomeMenu</span></li>
                }
            }
        }
    }
}

Когда я загружаю страницу, выдается System.StackOverflowException:

Произошло необработанное исключение типа «System.StackOverflowException» в System.Web.dll.

Почему это?


person Lucas Rodrigues Sena    schedule 09.11.2012    source источник
comment
Я бы подумал, что это связано с повторением одной и той же коллекции во вложенных циклах foreach (@ViewBag.Menus). Я хотел бы задаться вопросом, должны ли вы повторять что-то другое во втором foreach.   -  person Tommy    schedule 09.11.2012
comment
Но если я запускаю @Html.ActionLink(Home, Index, Home), все работает нормально, без каких-либо проблем, но меню будет только на одной странице внутри BodyRender.   -  person Lucas Rodrigues Sena    schedule 09.11.2012


Ответы (2)


Я думаю, это потому, что у вас есть:

@{Html.RenderAction("Index", "Home");}

которые возвращают View, затем берут _Layout.cshtml и бесконечный цикл...

person webdeveloper    schedule 09.11.2012
comment
Я думаю, что это правильно, так что какие-либо советы по реализации меню «Раздел» на _Layout? - person Lucas Rodrigues Sena; 09.11.2012
comment
@LucasRodriguesSena Поместите меню в PartialView и визуализируйте его с помощью Html.RenderAction из контроллера, добавьте кеширование, и все будет хорошо;) - person webdeveloper; 09.11.2012

Я столкнулся с аналогичной проблемой и получил ответ по ссылке ниже.

https://forums.asp.net/t/2130287.aspx?RenderAction+Infinite+Loop

Первый шаг, удалите приведенный ниже код

@{Html.RenderAction("Index", "Home");}

и это должно быть:

@Html.Action("Index", "Home")

Второй шаг:

В вашем частичном представлении установите макет с нулевым значением:

@{ Layout = null; }
person webbuilder    schedule 10.06.2018