Этот GetSubCategoriesFor
метод, кажется, выравнивает вашу иерархическую структуру, возвращая список, который смешивает категории, подкатегории, ...
Лично я бы использовал шаблоны отображения.Например, если у меня есть следующая модель представления:
public class CategoryViewModel
{
public int Id { get; set; }
public IEnumerable<string> Questions { get; set; }
public IEnumerable<CategoryViewModel> Subcategories { get; set; }
}
Я бы заполнил ее в контроллере.В моем примере я жестко закодировал значения для демонстрационных целей, но в вашем реальном примере эти значения, очевидно, будут получены из базы данных или чего-то еще, и они будут получены через репозиторий:
public class HomeController : Controller
{
public ActionResult Index()
{
var model = new[]
{
new CategoryViewModel
{
Id = 1,
Questions = new[] { "q1.1", "q1.2" },
Subcategories = new[]
{
new CategoryViewModel
{
Id = 2,
Questions = new[] { "q2.1" }
},
new CategoryViewModel
{
Id = 3,
Questions = new[] { "q2.2", "q2.3" }
},
}
},
new CategoryViewModel
{
Id = 4,
Questions = new[] { "q1.3", "q1.4" },
Subcategories = new[]
{
new CategoryViewModel
{
Id = 5,
Questions = new[] { "q2.4" }
},
}
},
};
return View(model);
}
}
, а затем мой ~/Views/Home/Index.aspx
представление будет выглядеть так:
<%@ Page
Language="C#"
MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<IEnumerable<AppName.Models.CategoryViewModel>>"
%>
<ul>
<%= Html.DisplayForModel() %>
</ul>
, а затем я бы определил шаблон отображения для категории (~/Views/Home/DisplayTemplates/CategoryViewModel.ascx
):
<%@ Control
Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.CanalViewModel>"
%>
<li>
<div>
<h3><%= Html.DisplayFor(x => x.Id) %></h3>
<%= Html.DisplayFor(x => x.Questions) %>
</div>
<ul>
<%= Html.DisplayFor(x => x.Subcategories) %>
</ul>
</li>
Теперь это ASP.NET MVC с шаблонамипомощники, которые позаботятся о циклическом просмотре древовидной структуры категорий и отобразят содержимое в представлении.Вы можете расширить это, определив комплекс QuestionViewModel
вместо строки, которую я использовал, и определив шаблон отображения для этого вопроса ~/Views/Home/DisplayTemplates/QuestionViewModel.ascx
, который будет отображаться для каждого элемента свойства Questions
категории.