Рекурсивный HTML-помощник в MVC странное поведение - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть большой опыт, чтобы знать, что «мой код ведет себя сумасшедшим», как правило, означает, что я, должно быть, где-то набрал что-то не так, но я действительно не могу понять это, поэтому я надеюсь, что сообщество придет на помощь.

В моем приложении 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) a 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]), и вот странное поведение: первоеВ тот момент, когда помощник вызывается из тела представления, корневая папка имеет 6 дочерних элементов, так что я попадаю в первый блок if ... then, а с этого момента также получаю доступ к первомуДля этих детей я получаю рекурсивный вызов.Но при втором рекурсивном вызове отладчик пропускает весь метод и переходит к последней скобке, немедленно закрывая рекурсию.

У меня есть три снимка экрана, три из которых подряд F11 на моей клавиатуре (Я дошел до того, что ставлю точку останова на каждую строку кода ... не обязательно, но я вижу, что отладка рендеринга страницы бритвы не похожа на обычную отладку на стороне сервера):

1) Здесь я на первой рекурсии, и я получил его на первый рекурсивный вызов (строка 16): enter image description here

2) Я нажимаю F11 на клавиатуре, и яв начале второго рекурсивного вызова (строка 7), когда объект currentArchiveFolder имеет значения, которые он должен иметь: enter image description here

3) Я снова нажимаю F11 ...а я в конце метода (строка 38) ??enter image description here

Что не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...