關於ASP.NET MVC 實現次層網域,已有講解,請見部落格園:http://www.cnblogs.com/luanwey/archive/2009/08/12/1544444.html。
現在我要說的是怎麼用routing engine (System.Web.Routing) 來自動註冊地區以實現多個Views。如一個做地區性的網站,像58、趕集網等,每個城市都分站,而每個城市的城市的頁面大致相同,只是根據每個城市去取資料!現在我們要完成一種功能,如網址:cs.8fdc.com 則載入的是長沙的視圖,而sz.8fdc.com 則載入的是深圳的視圖。而每個城市的視圖在結構位置上可能不同,所以又要可以單獨去寫該城市的視圖。
所以我們要的功能則是:cs.8fdc.com 應該是要匹配到 {area}.8fdc.com 這個路上滴! :我們要匹配到 Areas上的 cd或者 cs檔案夾下的視圖。
關於 註冊 Areas裡的視圖,微軟為我們提供了一種方法:
public class AreaRouting : AreaRegistration { public override string AreaName { get { return "cs"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Default1", // 路由名稱 "cs/{controller}/{action}/{id}", // 帶有參數的 URL new { action = "Index", id = UrlParameter.Optional }, null, new string[] { "HB.Controllers.WebSite" } // 選擇命名空間,此為HB.Controllers.WebSite的命名空間 ); } public static void RegisterRoutes(RouteCollection routes) { //routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); } }
繼承 AreaRegistration ,重寫方法則可註冊地區,當我們使用 http://localhost/cs/..., 則會註冊地區為cs,並匹配到該路由。
但是我們要的是 http://cs.8fdc.com/...這種 ,也就是我們要使用 http://{area}.8fdc.com 這種方式,根據 ASP.NET MVC 實現次層網域 這篇文章 我們可以這樣做
routes.Add("DomainRoute", new DomainRoute( "{area}.8fdc.com", // Domain with parameters< br /> "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" }, // Parameter defaults null, new string[] { "HB.Controllers.WebSite" }));
但實際上是無法去註冊地區的,我們只有將Route Data中的area寫入了,並沒有將 Data Tokens的 area。可使用 RouteDebug.dll 觀察路由資訊即可知!所以我們需修改 DomainRoute方法!在DomainRoute.cs 類裡修改此處
// 路由資料 RouteData data = null; if (domainMatch.Success && pathMatch.Success) { data = new RouteData(this, RouteHandler); // 添加預設選項 if (Defaults != null) { foreach (KeyValuePair<string, object> item in Defaults) { data.Values[item.Key] = item.Value; #region 此處將area及Namespaces寫入DataTokens裡 if (item.Key.Equals("area") || item.Key.Equals("Namespaces")) { data.DataTokens[item.Key]=item.Value; } #endregion } } // 匹配網域名稱路由 for (int i = 1; i < domainMatch.Groups.Count; i++) { Group group = domainMatch.Groups[i]; if (group.Success) { string key = domainRegex.GroupNameFromNumber(i); if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0)) { if (!string.IsNullOrEmpty(group.Value)) { data.Values[key] = group.Value; #region 新增將area寫入到DataTokens中 if (key.Equals("area")) { data.DataTokens[key]=group.Value; } #endregion } } } } // 匹配網域名稱路徑 for (int i = 1; i < pathMatch.Groups.Count; i++) { Group group = pathMatch.Groups[i]; if (group.Success) { string key = pathRegex.GroupNameFromNumber(i); if (!string.IsNullOrEmpty(key) && !char.IsNumber(key, 0)) { if (!string.IsNullOrEmpty(group.Value)) { data.Values[key] = group.Value; #region 新增將area寫入到DataTokens中 if (key.Equals("area")) { data.DataTokens[key]= group.Value; } #endregion } } } } } return data;
然後在 Global.asax 加入
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.Add("DomainRouteForManage", new DomainRoute( "manage.8fdc.com", // 固定的次層網域 "{controller}/{action}/{id}", // URL with parameters new { area = "Manage", controller = "Home", action = "Index", id = "", Namespaces = new string[] { "HB.Controllers.Manage" } } // Parameter defaults )); routes.Add("DomainRouteForMutiWebSite", new DomainRoute( "{area}.8fdc.com", // {area}作為次層網域 "{controller}/{action}/{id}", // URL with parameters new { area = "cs", controller = "Home", action = "Index", id = "", Namespaces = new string[] { "HB.Controllers.WebSite" } } // Parameter defaults )); routes.MapRoute( "Default", // 路由名稱 "{area}/{controller}/{action}/{id}", // 帶有參數的 URL new { area = "cs", controller = "Home", action = "Index", id = UrlParameter.Optional }, null, new string[] { "HB.Controllers.WebSite" } // 參數預設值 ); }
第一個 routes.Add 是使用固定的次層網域去 註冊地區 ,
第二個routes.Add則是使用 {area}作為次層網域。
最後routes.MapRoute 則是預設的路由方法 ,沒有註冊地區的功能,直接使用根目錄下預設的Views裡的視圖
此方法則可以實現 多個地區使用同一個控制器,而且不要重寫AreaRegistration裡的方法,可實現根據area的名稱來動態註冊地區,如果我們增加城市網站的話,只要複製Areas裡的cs檔案夾之類的就可以了!
項目原始碼 :http://download.csdn.net/detail/jobily/3668911
發布在csdn上,因為csdn上的號沒分了,希望大家幫我加加分!
再附上一個51cto的連結 :http://down.51cto.com/data/262527
文章寫的很差,大家可以下載代碼研究,不同可以提問問!
題外話 : 一直說要到部落格園上寫文章,結果還是沒能堅持,真恨自己太懶了。這個功能其實已經寫好幾個月了,一直說要發布出來,結果還是到了現在才發布出來,而且文章還是寫得那麼亂,而且還寫了整個晚上,真是沒寫作的天賦!不過還是得堅持把一些東西寫出來,分享給大家一起進步!