ASP.NET MVC 使用次層網域來註冊Area地區

來源:互聯網
上載者:User

     關於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

文章寫的很差,大家可以下載代碼研究,不同可以提問問!  

題外話 : 一直說要到部落格園上寫文章,結果還是沒能堅持,真恨自己太懶了。這個功能其實已經寫好幾個月了,一直說要發布出來,結果還是到了現在才發布出來,而且文章還是寫得那麼亂,而且還寫了整個晚上,真是沒寫作的天賦!不過還是得堅持把一些東西寫出來,分享給大家一起進步!



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.