本文示例源代碼或素材下載
先看下樣子
像這種導航欄(breadcrumbs)在mvc下我們來實現他。我們采用XML來實現這個功能。
1.首先做個准備,我們編寫rounting規則(順便提一句,我們要用到rounting功能,所以規則必須寫正確,不然出不來喔)
代碼如下
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"inner", // Route name
"resume/test/inner/{action}/{id}", // URL with parameters
new { controller = "inner", action = "Index", id = "" } // Parameter defaults
);
routes.MapRoute(
"test", // Route name
"resume/test/{action}/{id}", // URL with parameters
new { controller = "test", action = "Index", id = "" } // Parameter defaults
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" },
new { controller = "^(?!(test|inner)).*$", action = "^(?!test).*$" }
);
}
我們加了兩個規則
/resume/test
和/resume/test/inner
2.編寫用到的XML文件,注意是樹形結構的
在models寫個Navigator.XML
<?XML version="1.0" encoding="utf-8" ?>
<node Title="首頁" Description="潘峰的網站" Action="Index" Controller="Home">
<node Title="簡歷" Description="在線簡歷" Action="Index" Controller="Resume">
<node Title="Test" Description="Test" Action="Index" Controller="test">
<node Title="inner" Description="inner" Action="Index" Controller="inner">
</node>
</node>
</node>
</node>
3.編寫我們的類文件來實現Navigator
在models寫個navigatorHelper.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.XML;
using System.XML.Linq;
using System.Web.Routing;
using System.Web.Mvc;
using System.IO;
using System.Text;
namespace conansoft.Helpers
{
public static class MenuHelper
{
private static HttpServerUtilityBase Server = null;
private static HttpRequestBase Request = null;
private static UrlHelper Url = null;
private static RouteValueDictionary RouteDictionary = null;
public static string Navigator(this HtmlHelper helper)
{
Server = helper.VIEwContext.RequestContext.HttpContext.Server;
Request = helper.VIEwContext.RequestContext.HttpContext.Request;
Url = new UrlHelper(helper.VIEwContext.RequestContext);
RouteDictionary = helper.VIEwContext.RequestContext.RouteData.Values;
string xmlPath = Server.MapPath(Url.Content("~/Models/Navigator.XML"));
XDocument doc = XDocument.Load(XMLPath);
XElement node = FindNode(doc.Root);
StringBuilder sb = new StringBuilder();
Stack<XElement> s = new Stack<XElement>();
while (node != null)
{
s.Push(node);
node = node.Parent;
}
//輸出breadcrumbs.可以自行修改使之符合你的要求
while (s.Count() != 0)
{
node = s.Pop();
if (UrlEqual(node))
{
sb.AppendLine(string.Format("<li title='{1}'>{0}</li>", node.Attribute("Title").Value, node.Attribute("Description").Value));
}
else
{
sb.AppendLine(string.Format("<li><a href='{1}' title='{2}'>{0}</a></li>", node.Attribute("Title").Value,
Url.Action(node.Attribute("Action").Value, node.Attribute("Controller").Value),
node.Attribute("Description").Value));
sb.AppendLine("<span style='color:Black;font-weight:bold;'> > </span>");
}
}
return sb.ToString();
}
/// <summary>
/// 查找當前節點
/// </summary>
/// <param name="e">當前節點</param>
/// <returns>找到返回,找不到為空</returns>
private static XElement FindNode(XElement e)
{
XElement result = e;
if (UrlEqual(e))
{
return e;
}
else
{
if (e.HasElements)
{
foreach (XElement ee in e.Elements())
{
result = FindNode(ee);
}
}
else
{
return null;
}
return result;
}
}
/// <summary>
/// Url是否相等
/// </summary>
/// <param name="e">節點</param>
private static bool UrlEqual(XElement e)
{
string url1 = Url.Action(e.Attribute("Action").Value, e.Attribute("Controller").Value).ToLower();
string url2 = Url.RouteUrl(RouteDictionary).ToLower();
return url1 == url2;
}
}
}
解釋一下我們利用XML文件來實現breadcrumbs,並且我們用action和controller來判斷是否為當前路徑[UrlEqual]
在網頁中加入
<%=Html.Navigator() %>
好了效果如下
我的網站