1. 程式人生 > >ASP.NET MVC URL重寫與優化(初級篇)-使用Global路由表定製URL

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

在現今搜尋引擎制霸天下的時代,我們不得不做一些東西來討好爬蟲,進而提示網站的排名來博得一個看得過去的流量。

  URL重寫與優化就是搜尋引擎優化的手段之一。

  假如某手機網站(基於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。

  但一個好的URL要語義化,更好的反應網站結構,所以使用類名來作為URL要比分類id更勝一籌 :http://www.xxx.com/categoryname。

  這裡列舉了URL重寫與優化的最為普遍的兩個需求,

  這裡將分為兩篇來解決這兩個問題。

  這裡我假設各位看官已經對ASP.NET MVC 已經有所瞭解。文中有任何問題歡迎指正。

一,認識Global路由表

  我們新建一個ASP.NET MVC Web程式的時候,會生成一個Global.asax檔案。如下:

複製程式碼
 1 using System;
 2 using System.Collections.Generic;
3 using System.Linq; 4 using System.Web; 5 using System.Web.Mvc; 6 using System.Web.Routing; 7 8 namespace JohnConnor.Web 9 { 10 // 注意: 有關啟用 IIS6 或 IIS7 經典模式的說明, 11 // 請訪問 http://go.microsoft.com/?LinkId=9394801 12 13 public class MvcApplication : System.Web.HttpApplication 14 { 15 public
static void RegisterGlobalFilters(GlobalFilterCollection filters) 16 { 17 filters.Add(new HandleErrorAttribute()); 18 } 19 20 public static void RegisterRoutes(RouteCollection routes) 21 { 22 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 23 24 routes.MapRoute( 25 "Default", // 路由名稱 26 "{controller}/{action}/{id}", // 帶有引數的 URL 27 new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 引數預設值 28 ); 29 30 } 31 32 protected void Application_Start() 33 { 34 AreaRegistration.RegisterAllAreas(); 35 36 RegisterGlobalFilters(GlobalFilters.Filters); 37 RegisterRoutes(RouteTable.Routes); 38 } 39 } 40 }
複製程式碼

  首先Application_Start()是Web應用程式啟動的時候的入口。<RegisterGlobalFilters()方法是用來註冊全域性篩選器的,與本篇內容關係不大>

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

  這裡已經有了兩條預設的路由規則:

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

IgnoreRoute()是RouteCollection路由表類的擴充套件方法,用於忽略指定的路由請求。這句意思是忽略對副檔名為.axd檔案的請求。<這個方法不在此詳述>

   我們主要來看這一條路由規則:

 routes.MapRoute(
                "Default", // 路由名稱
                "{controller}/{action}/{id}", // 帶有引數的 URL
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 引數預設值
            );

  MapRoute()方法是一個新增路由對映的方法(RouteCollection類的擴充套件方法)。這裡是它最常用的一個過載,對映指定的 URL 路由並設定預設路由值:

  • "Default"是路由的名稱,這個名稱在應用程式的路由的集合(routes物件)中是唯一的,如果重名生成時就會報錯。
  • "{controller}/{action}/{id}"代表的是路由的 URL表示式
  •  new { controller = "Home", action = "Index", id = UrlParameter.Optional } 聲明瞭一個包含路由值的object匿名物件

  這條語句添加了一條路由規則,將URL表示式對映到一個路由值-指向某個Controller下的某個Action方法。

  e.g.:我們在瀏覽器中輸入相對地址/home/index HomeController.Index()方法就會被呼叫。

  釋出網站的時候Global.asax檔案會被編譯成DLL。程式啟動的時候就會首先呼叫Application_Start()方法, 

  執行RegisterRoutes(RouteTable.Routes)語句後,路由表就完成註冊了,預設路由規則開始生效。

  有了這條預設規則,我們就可以使用/controllername/actionname?querystring=...這樣的相對URL來呼叫程式中的每個action方法。

  熟悉ASP.NET MVC的人可以想到,如果沒有什麼特殊要求的系統,比如網站後臺,就不用再折騰了,一條預設路由規則足矣撐起整個Web程式了。

二,路由匹配規則

  1.首先我們需要科普一下如何來定義一條URL表示式。

  首先URL表示式都是相對的,不包括主機域名部份(比如http://www.xxx.com)。{}儲存的是佔位符,“/”,“.”則用來作為分隔符,什麼都有沒則是靜態內容:

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

  這裡需要注意的是{controller}{action}是保留的兩個佔位符,分別代表對應的控制器名稱和操作名稱。

  {controller}對應控制器的名稱,這裡規定是控制器全名去掉Controller字尾的部份,CategoryController即Category

  {action}對應控制器內的Action方法的名稱。

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

  獲取路由值,當你在瀏覽器輸入一個URL時,程式會在我們新增的路由表中通過對比URL表示式進行匹配,找到對應路由值。

    我們來看一個例子,我們來新增兩條路由規則。

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

  假設HomeController裡有兩個Action 分別是Index()Others()

  各位看官覺得在瀏覽器輸入http://www.xxx.com/where-are-you-going 哪個方法會被呼叫呢?如果上下顛倒一下呢?

  <呼叫HomeController.Index()/顛倒後呼叫HomeController.Others>

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

  即我們有了一個路由值,通過在路由表中匹配,可以找到對應的URL模式,進而生成一個URL

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

  現在我們在預設的路由規則下再新增一條如下的路由規則

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>

   如果把這條路由規則寫在預設規則的上面呢?

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

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

  這一點非常重要。很多人在定製路由規則的時候,總是發現自己的規則不生效。那麼你就應該檢查是不是被前面的路由覆蓋掉了。

三,解決開始的問題

  從這個站的URL可以看出,

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

  用的應該只是預設路由規則,

  可以推斷出有一個名為Category的控制器,其中有個方法名為ShowCategory,必選引數為categoryid,其他為可選引數。

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

  按照站長的要求,我們只需要新增一條路由規則就完事了。是不是很簡單?

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

  這時候一定要注意喔,不要寫在預設路由的下面,你懂得。不然你就悲劇了。

  一般情況下我們建議如果你需要使用Globel檔案來定製路由,請刪除最初的預設路由,並給每一個Action定製自己的路由。

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

  使用上述路由來取代預設路由。

  瀏覽器輸入相對URL “/”時就會呼叫HomeController.Index()方法了。

  這樣做的原因是,預設路由容易與定製路由起衝突。

  強烈建議大家自己動手玩一玩Global檔案,重寫URL來親身感受一下。其實有一個懸念我留給大家了,

  為什麼預設規則下獲取首頁的URL是“/”而不是“/home/index”呢。^_^

  匹配規則還有貪婪匹配和預設匹配一說,這個留大家去了解把。

  使用Global還是有很多的侷限性的,上例中因為方法ShowCategory有一個引數categoryid,它存在與路由資訊的鍵值對中,

  在配置時我們就可以使用佔位符來{categoryid}來顯示它。

  換作http://www.xxx.com/categoryname 這樣的URL,如果不修改程式,Global是無能為力的,因為categoryname並不存在與路由資訊的鍵值對中。

  應對這樣的較為複雜多變的URL重寫與優化的需求(需求總是複雜多變的=。=)。

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

相關推薦

ASP.NET MVC URL重寫優化(初級)-使用Global路由定製URL

在現今搜尋引擎制霸天下的時代,我們不得不做一些東西來討好爬蟲,進而提示網站的排名來博得一個看得過去的流量。   URL重寫與優化就是搜尋引擎優化的手段之一。   假如某手機網站(基於ASP.NET MVC)分類頁面URL是這樣的,   http://www.xxx.

ASP.NET MVC URL重寫優化(進階)-繼承RouteBase玩轉URL

在初級篇中,我們介紹瞭如何利用基於ASP.NET MVC的Web程式中的Global檔案來簡單的重寫路由。也介紹了它本身的侷限性-依賴於路由資訊中的鍵值對:   如果鍵值對中沒有的值,我們無法將其利用湊出我們想要的URL表示式。   在進階篇中,我們將介紹ASP.

七天學會ASP.NET MVC (六)——線程問題、異常處理、自定義URL

d+ mit nes 如何 bus blog edi default 繼續 本節又帶了一些常用的,卻很難理解的問題,本節從文件上傳功能的實現引出了線程使用,介紹了線程饑餓的解決方法,異常處理方法,了解RouteTable自定義路徑 。 目錄 實驗27—

七天學會ASP.NET MVC (六)——執行緒問題、異常處理、自定義URL

本文參考自:http://www.codeproject.com/Articles/1002109/Learn-MVC-Project-in-days-Day-6 轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。   本節又帶了一些常用的,卻很難理解的問

初識ASP.NET MVC窗體驗證許可權過濾---3.自定義過濾器驗證Session超時

        為了防止使用者在seesion過期之後進行操作,可以新增自定義過濾器驗證session是否過期,為了便於測試將過期時間設定為1分鐘,在Filters資料夾下新增一個自定義過濾器。namespace AuthStudy.Filters { public

初識ASP.NET MVC窗體驗證許可權過濾---1.窗體身份驗證

         一直不懂如何解決web系統的登入許可權控制問題,在最開始的時候,我用了一個很土的方法。使用者登入成功後就把使用者的身份資訊寫到一個會話cookie中。這種方法非常的脆弱而且不安全。比如a使用者登入後沒有退出功能頁面,此時他又登入了b使用者的賬戶,身份coo

Asp.net mvc 網站之速度優化 -- 頁面快取

網站速度優化的一般方法 由於網站最重要的使用者體驗就是速度,特別是對於電子商務網站而言。 一般網站速度優化會涉及到幾個方面: 1. 資料庫優化 — 查詢欄位簡歷索引,使用資料庫連線池和持久化,現在還有種趨勢,就是選擇使用No SQL作為補充; 2. 資料快取 — 使用Memc

初識ASP.NET MVC窗體驗證許可權過濾---2.基於角色的訪問控制

          上一篇完成了窗體身份驗證並在客戶端儲存了鑑權cookies,系統已經知道我已經登入並獲得了授權。但僅僅知道登入了是不夠的,還要對能夠訪問的區域做出控制。男人不能進女廁所,女人不能進男廁所O(∩_∩)O哈哈~           這裡就要來扯一扯AOP了,

ASP.NET MVC底層原理框架

前言 鄙人有一毛病,喜歡鑽研原理性的東西,感覺只知道怎麼用還不太夠,更想知道如何實現的以及為什麼會這樣。 暑假的時候做積分系統是第一次接觸MVC,感覺MVC就是一個框架,分為Module ,view和controller,瀏覽器傳過來的資訊先到達contro

ASP.NET MVC】ViewController之間傳遞數據

avg 信息 per $.ajax click 表單 tin manager 大小 1 概述 本篇文章主要從操作上簡要分析Controller<=>View之間相互傳值,關於頁面之間傳值,如果感興趣,可參考我另外一篇文章ASP.NET 頁面之間傳值的幾

Asp.net mvc+三層架構(註冊

                                            &

從零開始學習ASP.NET MVC 1.0 (一) 開天闢地入門

《從零開始學習ASP.NET MVC 1.0》 文章導航 一.摘要 隨著ASP.NET MVC 1.0版本的正式釋出, 我將本系列文章也更新到了1.0, 對於已經發表的文章我都會根據1.0版本重新編輯. 希望本系列文章能打給大家幫助. 二.前言 ASP.NET MVC是微軟官方提供的開源M

asp.net mvc 裡的Url.ActionUrl.RenderAction

其實,asp.net mvc 裡的Url.Action與Url.RenderAction,這根本就是兩個不同類的東西,不能相提並論。唯一有聯絡的,就是都跟action有關。記錄下來,主要是做個備忘錄。

ASP.NET MVC 提高運行速度的幾種性能優化方法

服務 排隊 等待 谷歌搜索 部署 lan str run 提高 主要介紹ASP.NETMVC 應用提速的六種方法,因為沒有人喜歡等待,所以介紹幾種常用的優化方法。 大家可能會遇到排隊等待,遇到紅燈要等待,開個網頁要等待,等等等。 理所當然,沒有人喜歡等待網頁慢吞吞地加載

ASP.NET MVC 排球計分程序 (三)需求分析數據庫設計

arch 情況 img 需求 全場 ima 功能 每次 str 需求分析: 軟件名稱:排球計分程序 1、 需要鍵入比賽人員的的姓名,需要根據場上的比賽結果及時做出操作,記分員可以在記錯的情況下撤銷上一部操作。比賽結束,記分員應能查詢到每個隊伍的進球情況,以及攔網、擊球等的

asp.net mvc中如何處理字符串對象之間的序列化反序列化(一)

osi strong 類結構 plain pbo edate inf esc arp 前臺我們一般用ajax來發送數據到後端進行處理,如果json數據結構和後臺的實體類結構一致,就直接可以反序列化為指定的對象進行操作,非常方便。 前端發送的json數據結構: 後端實體結

ASP.NET MVC 簡單的分頁思想實現

www 新增 圖文 tom 最簡 基本 描述 clas asp.net , 作為一個程序猿,數據分頁是每個人都會遇到的問題。解決方案更是琳瑯滿目,花樣百出。但基本的思想都是差不多的。   下面給大家分享一個簡單的分頁器,讓初學者了解一下最簡單的分頁思想,以及在ASP.NET

ASP.NET MVCCSRF(跨站腳本)攻擊

轉移 off end gis 帳戶 blank 表單 密碼 message CSRF 一 何為CSRF CSRF(Cross-site request forgery跨站請求偽造,也被稱成為“one click attack”或者session riding,通常縮寫為CS

ASP.NET MVC編程入門--MVC5 傳遞參數初始化數據

port ctp params cti 模型 top help mvc ring 傳遞參數格式: $(".limit").live("click", function () { top.location = "/Product

ASP.NET沒有魔法——ASP.NET MVC 數據庫之ORM

設計器 不同類 使用 運行程序 relation 編譯 如何 n) and 什麽是ORM   對象關系映射(Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程序技術,用於實現面向對象編程語言裏不同類型系統的數據