日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL

發(fā)布時(shí)間:2023/11/29 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ASP.NET MVC URL重寫與優(yōu)化(初級篇)-使用Global路由表定制URL

引言---

  在現(xiàn)今搜索引擎制霸天下的時(shí)代,我們不得不做一些東西來討好爬蟲,進(jìn)而提示網(wǎng)站的排名來博得一個(gè)看得過去的流量。

  URL重寫與優(yōu)化就是搜索引擎優(yōu)化的手段之一。

  假如某手機(jī)網(wǎng)站(基于ASP.NET MVC)分類頁面URL是這樣的,

  http://www.xxx.com/category/showcategory?categoryid=1000&view=list&orderby=price&page=1。

  太多的QueryString對爬蟲是不友好的,一般的做法是,去掉不必要的QueryString,讓URL更簡短 :http://www.xxx.com/category/1000。

  但一個(gè)好的URL要語義化,更好的反應(yīng)網(wǎng)站結(jié)構(gòu),所以使用類名來作為URL要比分類id更勝一籌 :http://www.xxx.com/categoryname。

?

  這里列舉了URL重寫與優(yōu)化的最為普遍的兩個(gè)需求,

  這里將分為兩篇來解決這兩個(gè)問題。

  • 初級篇-使用Global路由表定制URL
  • 進(jìn)階篇-繼承RouteBase玩轉(zhuǎn)URL

?

  這里我假設(shè)各位看官已經(jīng)對ASP.NET MVC 已經(jīng)有所了解。文中有任何問題歡迎指正。

? 

?

一,認(rèn)識Global路由表

?

  我們新建一個(gè)ASP.NET MVC Web程序的時(shí)候,會生成一個(gè)Global.asax文件。如下:

?

View Code

  首先Application_Start()是Web應(yīng)用程序啟動的時(shí)候的入口。<RegisterGlobalFilters()方法是用來注冊全局篩選器的,與本篇內(nèi)容關(guān)系不大>

  而RegisterRoutes()方法是用來注冊路由表的

  這里已經(jīng)有了兩條默認(rèn)的路由規(guī)則:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  IgnoreRoute()是RouteCollection路由表類的擴(kuò)展方法,用于忽略指定的路由請求。這句意思是忽略對擴(kuò)展名為.axd文件的請求。<這個(gè)方法不在此詳述>

?

?  我們主要來看這一條路由規(guī)則:

?

routes.MapRoute("Default", // 路由名稱"{controller}/{action}/{id}", // 帶有參數(shù)的 URLnew { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數(shù)默認(rèn)值);

?

  MapRoute()方法是一個(gè)添加路由映射的方法(RouteCollection類的擴(kuò)展方法)。這里是它最常用的一個(gè)重載,映射指定的 URL 路由并設(shè)置默認(rèn)路由值:

?

  • "Default"是路由的名稱,這個(gè)名稱在應(yīng)用程序的路由的集合(routes對象)中是唯一的,如果重名生成時(shí)就會報(bào)錯。
  • "{controller}/{action}/{id}"代表的是路由的?URL表達(dá)式
  • ?new?{ controller =?"Home", action =?"Index", id = UrlParameter.Optional }?聲明了一個(gè)包含路由值的object匿名對象

?  

  這條語句添加了一條路由規(guī)則,將URL表達(dá)式映射到一個(gè)路由值-指向某個(gè)Controller下的某個(gè)Action方法。

  e.g.:我們在瀏覽器中輸入相對地址/home/index?HomeController.Index()方法就會被調(diào)用。

?

  發(fā)布網(wǎng)站的時(shí)候Global.asax文件會被編譯成DLL。程序啟動的時(shí)候就會首先調(diào)用Application_Start()方法,?

  執(zhí)行RegisterRoutes(RouteTable.Routes)語句后,路由表就完成注冊了,默認(rèn)路由規(guī)則開始生效。

  有了這條默認(rèn)規(guī)則,我們就可以使用/controllername/actionname?querystring=...這樣的相對URL來調(diào)用程序中的每個(gè)action方法。

  熟悉ASP.NET MVC的人可以想到,如果沒有什么特殊要求的系統(tǒng),比如網(wǎng)站后臺,就不用再折騰了,一條默認(rèn)路由規(guī)則足矣撐起整個(gè)Web程序了。

?

?

二,路由匹配規(guī)則

?

  1.首先我們需要科普一下如何來定義一條URL表達(dá)式。

  首先URL表達(dá)式都是相對的,不包括主機(jī)域名部份(比如http://www.xxx.com)。{}保存的是占位符,“/”,“.”則用來作為分隔符,什么都有沒則是靜態(tài)內(nèi)容:

  • URL /category/showcategory/1000? 匹配?"{controller}/{action}/{id}"。
  • URL /product/2012/4/28.html???????? 匹配??“/product/{year}/{month}/{day}.html”? ,諸如此類。

?

  這里需要注意的是{controller}和{action}是保留的兩個(gè)占位符,分別代表對應(yīng)的控制器名稱和操作名稱。

  {controller}對應(yīng)控制器的名稱,這里規(guī)定是控制器全名去掉Controller后綴的部份,CategoryController即Category

  {action}對應(yīng)控制器內(nèi)的Action方法的名稱。

?

  2.路由有兩種不同的操作。

?

  獲取路由值,當(dāng)你在瀏覽器輸入一個(gè)URL時(shí),程序會在我們添加的路由表中通過對比URL表達(dá)式進(jìn)行匹配,找到對應(yīng)路由值。

 ?? 我們來看一個(gè)例子,我們來添加兩條路由規(guī)則。

routes.MapRoute("Test", "where-are-you-going", new { controller = "Home", action = "Index" }); routes.MapRoute("Test1", "where-are-you-going", new { controller = "Home", action = "Others" });

  假設(shè)HomeController里有兩個(gè)Action 分別是Index()和Others()。

?

  各位看官覺得在瀏覽器輸入http://www.xxx.com/where-are-you-going 哪個(gè)方法會被調(diào)用呢?如果上下顛倒一下呢?

  <調(diào)用HomeController.Index()/顛倒后調(diào)用HomeController.Others>

?

  獲取URL,下面這段代碼就使用Url.Action方法通過Controller和Action名完全限定了一個(gè)URL,

  即我們有了一個(gè)路由值,通過在路由表中匹配,可以找到對應(yīng)的URL模式,進(jìn)而生成一個(gè)URL

<a href="@Url.Action("Index", "Home")">主頁</a>

  現(xiàn)在我們在默認(rèn)的路由規(guī)則下再添加一條如下的路由規(guī)則

routes.MapRoute("MyHome", "myhome/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });

  你覺得頁面會顯示什么呢?

<a href="http://www.xxx.com/">主頁</a> or <a href="http://www.xxx.com/myhome">主頁</a>

 

   如果把這條路由規(guī)則寫在默認(rèn)規(guī)則的上面呢?

?  <誰寫在上面就顯示其匹配的URL>

?

?

  3.上面的問題大家可以自己嘗試一下,很明顯,路由的匹配是?自上而下?的,只要匹配到第一條記錄,就會返回對應(yīng)URL或者路由值。

  這一點(diǎn)非常重要。很多人在定制路由規(guī)則的時(shí)候,總是發(fā)現(xiàn)自己的規(guī)則不生效。那么你就應(yīng)該檢查是不是被前面的路由覆蓋掉了。

?

三,解決開始的問題

?

  從這個(gè)站的URL可以看出,

  http://www.xxx.com/category/showcategory?categoryid=1000&view=list&orderby=price&page=1,

  用的應(yīng)該只是默認(rèn)路由規(guī)則,

  可以推斷出有一個(gè)名為Category的控制器,其中有個(gè)方法名為ShowCategory,必選參數(shù)為categoryid,其他為可選參數(shù)。

  根據(jù)上面介紹的Global路由表來完成URL重寫的知識,

  按照站長的要求,我們只需要添加一條路由規(guī)則就完事了。是不是很簡單?

?

routes.MapRoute("Category", "category/{categoryid}", new { controller = "Category", action = "ShowCategory" }

  

  這時(shí)候一定要注意喔,不要寫在默認(rèn)路由的下面,你懂得。不然你就悲劇了。

?

  一般情況下我們建議如果你需要使用Globel文件來定制路由,請刪除最初的默認(rèn)路由,并給每一個(gè)Action定制自己的路由。

routes.MapRoute("Home", "", new { controller = "Home", action = "Index" });

  使用上述路由來取代默認(rèn)路由。

  瀏覽器輸入相對URL “/”時(shí)就會調(diào)用HomeController.Index()方法了。

  這樣做的原因是,默認(rèn)路由容易與定制路由起沖突。

?

  強(qiáng)烈建議大家自己動手玩一玩Global文件,重寫URL來親身感受一下。其實(shí)有一個(gè)懸念我留給大家了,

  為什么默認(rèn)規(guī)則下獲取首頁的URL是“/”而不是“/home/index”呢。^_^

  匹配規(guī)則還有貪婪匹配和缺省匹配一說,這個(gè)留大家去了解把。

?

?

  使用Global還是有很多的局限性的,上例中因?yàn)榉椒⊿howCategory有一個(gè)參數(shù)categoryid,它存在與路由信息的鍵值對中,

  在配置時(shí)我們就可以使用占位符來{categoryid}來顯示它。

  換作http://www.xxx.com/categoryname 這樣的URL,如果不修改程序,Global是無能為力的,因?yàn)閏ategoryname并不存在與路由信息的鍵值對中。

  應(yīng)對這樣的較為復(fù)雜多變的URL重寫與優(yōu)化的需求(需求總是復(fù)雜多變的=。=)。

?

  ---------------------------------------初級篇完--------------------------------------------

轉(zhuǎn)載于:https://www.cnblogs.com/littlewrong/p/5540035.html

總結(jié)

以上是生活随笔為你收集整理的ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。