ASP.NET MVCは2級ドメイン名を使用してAreaエリアを登録する

10240 ワード

ASPについてNET MVCは2級ドメイン名を実現し、すでに説明があり、ブログ園:http://www.cnblogs.com/luanwey/archive/2009/08/12/1544444.htmlを参照してください.
ここで私が言いたいのは、routing engine(System.Web.Routing)を使用して、複数のViewを実現するために領域を自動的に登録する方法です.地域的なサイトを作ると、58、ネットなど、都市ごとに駅が分かれていますが、都市ごとのページはほぼ同じで、都市ごとにデータを取りに行くだけです.ウェブサイト:cs.8fdc.comは長沙のビューをロードし、sz.8fdc.comは深センのビューをロードします.都市ごとにビューが構造的に異なる場合があるので、都市のビューを単独で書くこともできます.
私たちが求めている機能はcsです8fdc.comは{area}.8 fdcにマッチするはずです.comこの道で垂らして!図:Areas上のcdまたはcsフォルダの下のビューに一致します.
ASP.NET MVC 使用二级域名来注册Area区域_第1张图片
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}.8 fdcを使用します.comという方法では、ASP.NET MVCは2級ドメイン名を実現という文章に基づいて、私たちはこのようにすることができます.
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" } //      
              );

           
        }

最初のroutesAddは、図のように固定された2級ドメイン名を使用して領域を登録します.
ASP.NET MVC 使用二级域名来注册Area区域_第2张图片
2番目のroutesAddは二次ドメイン名として{area}を使用します.
ASP.NET MVC 使用二级域名来注册Area区域_第3张图片
  
最後にMapRouteはデフォルトのルーティング方法で、登録エリアの機能はなく、ルートディレクトリの下のデフォルトのViewのビューを直接使用します.
ASP.NET MVC 使用二级域名来注册Area区域_第4张图片
この方法では、複数の領域で同じコントローラを使用することができ、AreaRegistrationの方法を書き換えることなく、areaの名前に基づいて領域を動的に登録することができます.都市サイトを増やせば、Areasのcsフォルダなどをコピーすればいいのです.
プロジェクトソース:http://download.csdn.net/detail/jobily/3668911
csdnに発表して、csdnの上の号が分けていないため、みんなが私にプラス点を加えることを望みます!
51 ctoのリンクを添付します.http://down.51cto.com/data/262527
文章の書くのはとても悪くて、みんなはコードの研究をダウンロードすることができて、異なって質問することができます! 
余談:ブログ園まで文章を書くと言っていたのに、結局続けられなかったので、自分が怠け者だと憎んでいました.この机能は実はすでに何ヶ月も书いて、ずっと発表すると言って、结果はやはり今になってやっと発表して、その上文章はやはりそんなに乱れて、その上また一晩中书いて、本当に书く天賦がありません!しかし、やはりいくつかのものを書くことを堅持して、みんなに分かち合って一緒に進歩しなければなりません!