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フォルダの下のビューに一致します.
Areasに登録されているビューについて、マイクロソフトは私たちに方法を提供してくれました.
AreaRegistrationを継承し、書き換え方法で領域を登録できます.http://localhost/cs/...を選択すると、領域がcsに登録され、ルーティングに一致します.
でも私たちが欲しいのはhttp://cs.8fdc.com/...これはhttp://area}.8 fdcを使用します.comという方法では、ASP.NET MVCは2級ドメイン名を実現という文章に基づいて、私たちはこのようにすることができます.
しかし、実際にはエリアを登録することはできません.Route Dataのareaを書き込むしかありません.Data Tokensのareaはありません.RouteDebugを使用可能dllルーティング情報を観察するとわかります!DomainRouteメソッドを変更する必要があります!DomainRoute.csクラスでここを修正
そしてGlobalでasax加入
最初のroutesAddは、図のように固定された2級ドメイン名を使用して領域を登録します.
2番目のroutesAddは二次ドメイン名として{area}を使用します.
最後にMapRouteはデフォルトのルーティング方法で、登録エリアの機能はなく、ルートディレクトリの下のデフォルトのViewのビューを直接使用します.
この方法では、複数の領域で同じコントローラを使用することができ、AreaRegistrationの方法を書き換えることなく、areaの名前に基づいて領域を動的に登録することができます.都市サイトを増やせば、Areasのcsフォルダなどをコピーすればいいのです.
プロジェクトソース:http://download.csdn.net/detail/jobily/3668911
csdnに発表して、csdnの上の号が分けていないため、みんなが私にプラス点を加えることを望みます!
51 ctoのリンクを添付します.http://down.51cto.com/data/262527
文章の書くのはとても悪くて、みんなはコードの研究をダウンロードすることができて、異なって質問することができます!
余談:ブログ園まで文章を書くと言っていたのに、結局続けられなかったので、自分が怠け者だと憎んでいました.この机能は実はすでに何ヶ月も书いて、ずっと発表すると言って、结果はやはり今になってやっと発表して、その上文章はやはりそんなに乱れて、その上また一晩中书いて、本当に书く天賦がありません!しかし、やはりいくつかのものを書くことを堅持して、みんなに分かち合って一緒に進歩しなければなりません!
ここで私が言いたいのは、routing engine(System.Web.Routing)を使用して、複数のViewを実現するために領域を自動的に登録する方法です.地域的なサイトを作ると、58、ネットなど、都市ごとに駅が分かれていますが、都市ごとのページはほぼ同じで、都市ごとにデータを取りに行くだけです.ウェブサイト:cs.8fdc.comは長沙のビューをロードし、sz.8fdc.comは深センのビューをロードします.都市ごとにビューが構造的に異なる場合があるので、都市のビューを単独で書くこともできます.
私たちが求めている機能はcsです8fdc.comは{area}.8 fdcにマッチするはずです.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}.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級ドメイン名を使用して領域を登録します.
2番目のroutesAddは二次ドメイン名として{area}を使用します.
最後にMapRouteはデフォルトのルーティング方法で、登録エリアの機能はなく、ルートディレクトリの下のデフォルトのViewのビューを直接使用します.
この方法では、複数の領域で同じコントローラを使用することができ、AreaRegistrationの方法を書き換えることなく、areaの名前に基づいて領域を動的に登録することができます.都市サイトを増やせば、Areasのcsフォルダなどをコピーすればいいのです.
プロジェクトソース:http://download.csdn.net/detail/jobily/3668911
csdnに発表して、csdnの上の号が分けていないため、みんなが私にプラス点を加えることを望みます!
51 ctoのリンクを添付します.http://down.51cto.com/data/262527
文章の書くのはとても悪くて、みんなはコードの研究をダウンロードすることができて、異なって質問することができます!
余談:ブログ園まで文章を書くと言っていたのに、結局続けられなかったので、自分が怠け者だと憎んでいました.この机能は実はすでに何ヶ月も书いて、ずっと発表すると言って、结果はやはり今になってやっと発表して、その上文章はやはりそんなに乱れて、その上また一晩中书いて、本当に书く天賦がありません!しかし、やはりいくつかのものを書くことを堅持して、みんなに分かち合って一緒に進歩しなければなりません!