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) ฉันสงสัยว่าคุณควรทำซ้ำสิ่งที่แตกต่างออกไปในการค้นหาครั้งที่สองของคุณหรือไม่   -  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
ฉันคิดว่ามันถูกต้องแล้ว มีคำแนะนำในการใช้ Menu ‹Section› บน _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