文章目錄
- I:URL友好化的優勢
- II:在ASP.NET MVC3當中URL友好化的實現
- III:自訂檔案尾碼名的執行個體下載
I:URL友好化的優勢
在過去,我們開發ASP.NET應用程式的時候常常會使用URL的QueryString去傳遞參數給ASP.NET處理.
如:http://localhost:1029/Default.aspx?key_1=value_1&key_2=value_2&key_3=value_3
在使用此類URL格式去做門戶網站時,非常不利於讓搜尋引擎收錄頁面.另外還包含.aspx結尾還會令搜尋引擎爬蟲燭覺得這個頁面是動態網頁從而放棄收錄或降低頁面在搜尋結果中的排名.
面對這個問題,我們為了討好搜尋引擎爬蟲首先必須要做的是:
A:使QueryString徹底消失,讓爬蟲認為這是一個獨立頁面
B:將.aspx更改為可自訂的尾碼名格式(偽靜態)
C:正確設定robots.txt
實驗例子:
注意:/Default/Value_1/Value_2/Value_3.html這個檔案根本不存在於硬碟上~
我們做下對比
舊URL:
http://localhost:1029/Default.aspx?key_1=value_1&key_2=value_2&key_3=value_3
新URL:
http://localhost:2636/Default/Value_1/Value_2/Value_3.jsp
http://localhost:2636/Default/Value_1/Value_2/Value_3.html
與之前的URL作對比,新的URL更短並實現了自訂檔案尾碼格式!更利於爬蟲進行檢索收錄工作
另外
以下的路徑均屬於1個頁面:
/Default.aspx?key_1=something
/Default.aspx?key_1=anything
以下的路徑將會分為多個頁面(從訪問者角度來看):
/Default/something.html
/Default/anything.html
像這類短URL還有助於使用者記憶及反映網站結構,下面舉個例子
比如在部落格園裡我的部落格URL為http://www.cnblogs.com/highend/
而其他使用者的URL則為http://www.cnblogs.com/UserName/
因為有了這個友好化URL,從而避免了出現尷尬的URL http://www.cnblogs.com/blog.aspx?userName=highend
接下來介紹在ASP.NET MVC當中友好化URL的實現!
II:在ASP.NET MVC3當中URL友好化的實現
在瞭解了URL友好化的優勢以後,接下來將會為你介紹在ASP.NET MVC3中實現URL友好化的重型武器 - 路由.
小提示:路由並不是ASP.NET MVC專屬!而是ASP.NET中的一個重要功能!MVC裡的路由只不過是擴充了ASP.NET的路邊由功能罷了!
1.ASP.NET MVC3路由註冊的位置
當建立好一個MVC3項目後,可以在根目錄下的Global.asax.cs檔案內看到定義了一個繼承System.Web.HttpApplication類的MvcApplication類,這個類裡面就包含了MVC3的路由設定.具體請看下面貼出的MvcApplication部分代碼
public static void RegisterRoutes(RouteCollection routes){ routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults );}protected void Application_Start(){ AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes);}
摘段MSDN的關於Application_Start的介紹
Application_Start 和 Application_End 方法是不表示 HttpApplication 事件的特殊方法。在應用程式定義域的生命週期期間,ASP.NET 僅調用這些方法一次,而不是對每個 HttpApplication 執行個體都調用一次。
在此MVC3應用程式是通過在Application_Start()方法裡調用靜態方法RegisterRoutes(RouteCollection routes)使ASP.NET有執行個體化MvcHandler的能力,而RegisterRoutes方法內的routes.MapRoute( … )是MVC3裡對RouteCollection添加的擴充方法,位於System.Web.Mvc.RouteCollectionExtensions!
提示:ASP.NET路由是一個Module位於
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Config\web.config
<httpModules>
...
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
...
</httpModules>
2.ASP.NET MCV3路由的使用介紹
前面第1小節裡,我們已經知道了ASP.NET MVC3對System.Web.Routing.RouteCollection類進行了擴充,下面我將列出擴充方法的重載列表.然後對其找出一個參數最多的進行詳細介紹!
System.Web.Mvc.RouteCollectionExtensions類 - 擴充方法列表的詳細地址:
第一個我要介紹的是IgnoreRoute(string url)方法~
他的功能是用於將參數內設定的url排除在路由處理常式之外,也就是:忽略給定可用路由列表和約束列表的指定 URL 路由。
我們引用上一節裡面的一行代碼
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
作用:使路由系統忽略處理ASP.NET的Web資源檔(WebResource.axd或ScriptResource.axd).
另外這裡的{resource}與{*pathInfo}我還未能在官網上找到詳細的介紹資料.~所以在這我也只好忽略不談~接著關注MapRoute的功能.
MapRoute方法在RouteCollectionExtensions裡有6個重載版本!在這裡我挑了一個參數最多的重載版本來進行介紹
public static Route MapRoute(
this RouteCollection routes,
string name,
string url,
Object defaults,
Object constraints,
string[] namespaces
)
name:路由在路由列表裡的唯一名字(兩次MapRoute時name不能重複)
url:路由匹配的url格式
defaults:路由url {預留位置} 的預設值
constraints:url的 {預留位置} 的約束
namespaces:這個是用於設定路由搜尋的控制器命名空間!
在此詳細分別介紹一下url, defaults, constraints這三個重要參數
在上章節的代碼裡MapRoute裡面使用到了MVC裡提供的兩個特殊預留位置{controller}及{action}它們分別描述的內容具體如下:
對此當MapRoute設定為
routes.MapRoute( "Default", //name "{controller}/{action}", //url new { controller = "Home", action = "Index" }, //defaults null, //constraints null //namespaces);
時,訪問
http://localhost:2317/home/index
{controller} = home, {action} = index [注意,提交的url是不區分大小寫]
http://localhost:2317/Home/About
{controller} = home, {action} = about
http://localhost:2317/blog/home
{controller} = blog, {action} = home
http://localhost:2317/account/logon
{controller} = account, {action} = logon
在這裡為你講述一下defaults的作用.~
當你請求的Url屬於
http://localhost:2317/
{controller} = null, {action} = null
http://localhost:2317/Home/
{controller} = home, {action} = null
http://localhost:2317/blog/
{controller} = blog, {action} = null
在此~defaults會自動利用你設定好的預設值去設定{controller}及{action}
new { controller = "Home", action = "Index" }, //defaults
所以~如果你請求的url屬於這種錯誤格式http://localhost:2317//index時~defaults並不會幫你自動完成設定
因為設定要有一個先後次序!
OK.url參數就先介紹到這裡,更多的用途我會放在下一篇(控制器 & 視圖)文章當中進行講解!
MapRoute目前剩下的1個參數constraints的功能是對先前定義的{預留位置}進行添加一個正則約束比如:
routes.MapRoute( "constraints", //name "{controller}/{action}", //url null, //defaults new { controller = @"[a-z]{4,}", //controller必須為英文字元,最少長度為4 action = @"[a-z]{4,}" //action必須為英文字元,最少長度為4 }, //constraints null //namespaces);
對於上面的MapRoute我們測試以下請求的URL的結果為:
/Home/index 通過
/Home/Seo 失敗
/abc/Defgs 失敗
如果你覺得正則匹配不符合你的要求那麼你可以去實現System.Web.Routing.IRouteConstraint介面以滿足你的要求!
在這裡提及一下string[] namespaces參數.~
當在你的MVC3應用程式裡建立了不是以Controllers結尾的控制器類命名空間時,就可以通過設定這個屬性來讓路由系統在url匹配時應該去找那些命名空間
routes.MapRoute("namespaces",
"{controller}/{action}",
null, null,
new string[] { "MvcApplication1.Custom" }
);
設定後此參數後路由系統就會去找
MvcApplication1.Controllers, MvcApplication1.Custom下帶Controller結尾的繼承於Controller的類了!
介紹一下建立有Area時路由的註冊情況:
III:自訂檔案尾碼名的執行個體下載
下載原始碼
樣本內用到的是IIS Express如果你沒有安裝IIS Express的話需要更改.csproj檔案內的
<UseIISExpress>true</UseIISExpress> 設定為相應的值
參考資料:MSDN, ASP.NET MVC 1.0進階編程
本文到此結束!