我有很多经验,知道“我的代码表现得很疯狂”通常意味着我必须在某个地方键入了错误的内容,但是我确实无法掌握这些内容,因此我希望社区中的人们能够有所救助
在我用于存档的MVC应用程序中,有:
1)一个Folder
类,代表整个文件夹模型:
public class Folder
{
public int ID { get; set; }
public string Name { get; set; }
public int LeftIndex { get; set; }
public int RightIndex { get; set; }
public Folder Parent { get; set; }
public List<Folder> Children { get; set; }
}
2)一个ArchiveViewModel
和ArchiveFolderViewModel
类,表示归档(及其文件夹)中包含用户根据其角色和权限访问的文档的那部分:
public class ArchiveViewModel
{
public int Position { get; set; }
public Employer AEmployer { get; set; }
public User AUser { get; set; }
public List<ArchiveFolderViewModel> Folders { get; set; }
}
public class ArchiveFolderViewModel
{
public Folder ArchiveFolder { get; private set; }
public List<Document> Documents { get; private set; }
public ArchiveFolderViewModel(Folder folder, List<Document> documents)
{
this.ArchiveFolder = folder;
this.Documents = documents.Where(d => d.Folder.LeftIndex == folder.LeftIndex).ToList();
}
}
控制器正在(正确地)填充ViewModel,并且在我看来,我有这个html帮助器,它应该显示按递归文件夹结构分组的文档:
@model Archivio.WebUI.Models.ArchiveViewModel
@helper Recur(ArchiveFolderViewModel current)
{
<span class="nome-cartella">@current.ArchiveFolder.Name</span>
if (current.ArchiveFolder.Children != null
&& current.ArchiveFolder.Children.Count > 0)
{
<div class="gruppo-cartelle">
@foreach (Folder folder in current.ArchiveFolder.Children)
{
if (Model.Folders.Where(cf => cf.ArchiveFolder.ID == folder.ID).Any())
{
Recur(Model.Folders.Where(cf => cf.ArchiveFolder.ID == folder.ID).First());
}
}
</div>
}
else
{
<div class="elenco-documenti">
@if (current.Documents != null)
{
foreach (Document document in current.Documents)
{
<div class="documento">
<span>
<i class="far fa-file-pdf"></i>
</span>
// document details
</div>
}
}
</div>
}
}
我用一个简单的@Recur(Model.Folders[0])
来调用它,这是一个奇怪的行为:第一次从视图主体中调用helper时,根文件夹有6个孩子,因此我进入了第一个{{1} }块,从那时起,我还可以访问第一个孩子,然后进入递归调用。但是在第二次递归调用时,调试器会跳过整个方法,并移至最后一个括号,立即关闭递归。
我有三个屏幕截图,分别是键盘上的三个连续 F11(我已经到了在代码的每一行都放置断点的地步。。应该没必要,但是我看到调试呈现剃须刀页面与普通的服务器端调试不同):
1)在这里,我正在进行第一次递归,并进入了第一次递归调用(第16行):
2)我按了键盘上的F11键,并且在第二个递归调用(第7行)的开始,而if ... then
对象具有它应该具有的值:
怎么了?