У меня есть большой опыт, чтобы знать, что «мой код ведет себя сумасшедшим», как правило, означает, что я, должно быть, где-то набрал что-то не так, но я действительно не могу понять это, поэтому я надеюсь, что сообщество придет на помощь.
В моем приложении 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):
2) Я нажимаю F11 на клавиатуре, и яв начале второго рекурсивного вызова (строка 7), когда объект currentArchiveFolder
имеет значения, которые он должен иметь:
3) Я снова нажимаю F11 ...а я в конце метода (строка 38) ??
Что не так?