大型B2B网站开发手记 2

时间:2021-11-10 20:02:13

刚开始做功能的时候,发现有个“面包屑”导航的功能穿插到了所有的页面。这个看似不起眼的小功能以前没有注意过,现在决定来实现一下

所谓面包屑,即页面层级导航,例如

首页>>我的博客>>随笔

观察了一下这个结构,分析如下:

1.结构肯定是父子结构,即树形结构

2.需要事先把这种结构的数据存放好,在页面上动态加载

好了,思路有了,开始实现。首先看第一条,通常解决这种树形结构的方案是用数据库或者XML,但是我不想再项目中用IO读取文件,所以决定用数据库,建好表(T_Navigator),包括id,action,control,name,parentid字段。其中action放页面的action名,control放控制器名,name放页面名称,parentid放上层页面地址

在global的Application_Start里面使用HttpRuntime.Cache.Insert,把数据库中读取T_Navigator表的列表放入HttpRuntime.Cache中,当然,这里也可以用static的全局变量或者httpcontext.cache,但是用HttpRuntime性能会好点,特别是数据量大的时候。

接下来在模板view中获得当前页面的view和control

//获得当前页面control名称
string control = ViewContext.RouteData.Route.GetRouteData(this.Context).Values["controller"].ToString();
//获得当前页面action名称
string action = ViewContext.RouteData.Route.GetRouteData(this.Context).Values["action"].ToString();

然后扩展Htmlhelper,写一个返回MvcHtmlString类型的扩展方法GetNavigator(control, action),先获得HttpRuntime.Cache中的导航信息列表,然后传入action和control,找到当前页面的id和name,通过迭代找到所有的父页面的id和name,根据前端需求(例如a标签或者span或者其他标签),拼接成xxx>>xxx>>xxx的形式,然后返回MvcHtmlString

最后在模板view上用  @Html.GetNavigator(control, action)即可获得面包屑导航。

使用这个方法要注意几点:

1.新增view或者新的action的时候,只要是要刷新页面的时候,都要在T_Navigator中加入对应的信息

2.T_Navigator加入了新的页面,需要重启IIS或者重新生成,因为T_Navigator中的数据是载入缓存的