多级的层次结构的表现是一个令人头疼的问题,尤其是涉及到数据库的读取和更改。好在目前已经有很多工具可以辅助解决这个难题。Web From 中的 Treeview无疑是很强大的工具,不过在MVC2中用不上了,得重新想办法才是。
有个叫Mick Bosch的人写了一篇这样的技术文章《Hierarchical Treeview with ASP.NET MVC & jQuery》,利用MVC用户控件来做递归,实现数据库的读取,再利用jQuery插件jQuery.Treeview来改善表现。正式利用该文的思路,我做了一份MVC2的实现品。根据下面的评论,实现的方式稍微有点不同。
数据库结构很简单,使用Entity Framework 4 建立一个只有3个属性的实体就可以了:
通过实体生成数据库,顺便添加一些数据:
Insert into Categories ([Name],[ParentId]) values ('鞋子',null);
Insert into Categories ([Name],[ParentId]) values ('帽子',null);
Insert into Categories ([Name],[ParentId]) values ('衣服',null);
Insert into Categories ([Name],[ParentId]) values ('男鞋',1);
Insert into Categories ([Name],[ParentId]) values ('女鞋',1);
Insert into Categories ([Name],[ParentId]) values ('男装',3);
Insert into Categories ([Name],[ParentId]) values ('女装',3);
Insert into Categories ([Name],[ParentId]) values ('凉鞋',5);
Insert into Categories ([Name],[ParentId]) values ('长筒',5);
新建一个MVC用户控件,控件的代码修改如下:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<TreeviewDemo.Category>>" %>
<%
foreach(var category in Model){
%>
<li>
<%:category.Name %>
<% var children = (ViewData["categories"] as IEnumerable<TreeviewDemo.Category>).Where(c => c.ParentId == category.ID);
if (children.Count() > 0)
{%>
<ul>
<% Html.RenderPartial("ItemControl", children); %>
</ul>
<%}%>
</li>
<%} %>
控制器这样写:
public ActionResult TreeView()
{
using (Model1Container db = new Model1Container())
{
var categories = db.Categories.ToList();
ViewData["categories"] = categories;
return View(categories.Where(c=>c.ParentId == null));
}
}
视图中调用MVC用户控件:
<%Html.RenderPartial("ItemControl", Model); %>
最终效果:
提供项目源码下载。数据库很简单,就不提供了。
