这个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 属性的每个元素呈现。