MVC异常行为中的递归html帮助器

时间:2019-04-04 15:00:28

标签: asp.net-mvc recursion razor

我有很多经验,知道“我的代码表现得很疯狂”通常意味着我必须在某个地方键入了错误的内容,但是我确实无法掌握这些内容,因此我希望社区中的人们能够有所救助

在我用于存档的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)一个ArchiveViewModelArchiveFolderViewModel类,表示归档(及其文件夹)中包含用户根据其角色和权限访问的文档的那部分:

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行): enter image description here

2)我按了键盘上的F11键,并且在第二个递归调用(第7行)的开始,而if ... then对象具有它应该具有的值: enter image description here

3)我再次按下F11 ...我在方法的结尾(第38行)? enter image description here

怎么了?

0 个答案:

没有答案