gpt4 book ai didi

c# - 在 MVC 中使用递归局部 View 引发 Stack empty InvalidOperationException

转载 作者:太空宇宙 更新时间:2023-11-03 10:43:46 24 4
gpt4 key购买 nike

我想用递归元素创建一个递归菜单。我的第一种方法是使用分部 View 以重用代码。唉,当我运行代码时,它抛出“System.InvalidOperationException”“Stack empty”错误。

我正在使用 AutoMapper 映射来自 Web 服务的数据,这会生成以下实体:

public interface INavigationItemContract
{
int Id { get; set; }
string Title { get; set; }
int ParentId { get; set; }
string Url { get; set; }
bool DisplayInMenu { get; set; }
decimal SortOrder { get; set; }
IEnumerable<IPageBaseContract> Pages { get; set; }
IEnumerable<INavigationItemContract> Sites { get; set; }
}

初始化菜单的局部 View (_Menu.cshtml):

@model IEnumerable<INavigationItemContract>

<div class="navbar navbar-default" role="navigation">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="/">Home</a></li>
@foreach (var navigationItem in Model)
{
@Html.Partial("_MenuItem", navigationItem);
}
</ul>
</div>
</div>

显示菜单项的部分(_MenuItem.cshtml):

@model INavigationItemContract

@if (Model.Pages != null && Model.Pages.Any())
{
if (Model.Pages.Count() == 1 || !Model.DisplayInMenu)
{
// Only one page, so this will be the default.
// Other option is that the pages should not be displayed, so then we'll only display the link to the site.
<li><a href="@Model.Url">@Model.Title</a></li>
}
else
{
<li>
<a href="#">@Model.Title</a>
<ul class="dropdown-menu">
@foreach (var page in Model.Pages)
{
<li><a href="@page.RelativeUrl">@page.Title</a></li>
}
@foreach (var site in Model.Sites)
{
@Html.Partial("_MenuItem", site)
}
</ul>
</li>
}
}

更换时

@Html.Partial("_MenuItem", site)

<li>@site.Title</li>

一切都像一个魅力(除了它不是期望的结果)。

我也尝试过以下方法:

  • 创建一个显示模板
  • 使用 Html.RenderPartial 而不是 Html.Partial

异常发生在_MenuItem.cshtml:

@Html.Partial("_MenuItem", site)

它不会在第一次调用部分时发生(在 _Menu.cshtml 中),仅在 _MenuItem.cshtml 本身中发生,当它调用自身时。

为什么我会收到此异常?可能的解决方案是什么?

最佳答案

我找到了解决方法。这个异常仍然让我感到困惑,但我可以继续渲染菜单(即使我没有能力在帮助代码上设置断点)。

@model IEnumerable

@helper RecursiveMenuItem(INavigationItemContract menuItem)
{
if (menuItem.Pages != null && menuItem.Pages.Any())
{
if (menuItem.Pages.Count() == 1 || !menuItem.DisplayInMenu)
{
// Only one page, so this will be the default.
// Other option is that the pages should not be displayed, so then we'll only display the link to the site.
<li><a href="@menuItem.Url">@menuItem.Title</a></li>
}
else
{
<li>
<a href="#">@menuItem.Title</a>
<ul class="dropdown-menu">
@foreach (var page in menuItem.Pages)
{
<li><a href="@page.Url">@page.Title</a></li>
}
@foreach (var site in menuItem.Sites)
{
@RecursiveMenuItem(site)
}
</ul>
</li>
}
}
}
<div role="navigation">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="">Home</a></li>
@foreach (var menuItem in Model)
{
@RecursiveMenuItem(menuItem)
}
</ul>
</div>
</div>

关于c# - 在 MVC 中使用递归局部 View 引发 Stack empty InvalidOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24280534/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com