我有一个MVC应用程序,它有一个Controller,它有一个返回IEnumerable的递归方法
public static IEnumerable<Category> GetSubCategoriesFor(int catId)
{
var subs = _db.Category.Where(c => c.parrent_id == catId);
foreach (var sub in subs)
{
yield return sub;
// Recursive call
foreach (var subsub in GetSubCategoriesFor(sub.category_id))
{
yield return subsub;
}
}
关键是我需要我的观点来显示子类别中的所有类别,子类别和问题(这是一个问题)
所以我的问题是,如何从我的视图中调用此方法?
我看过他们使用Html.Action的一些例子,但我不能迭代字符串或无效
提前致谢!
答案 0 :(得分:1)
这个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
的每个元素呈现属性。
答案 1 :(得分:0)