天天看點

MVC TIP2:路由

1:簡單路由

建立MVC的時候會給我們建立預設的路由,如下:

routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );      

表示假設你在浏覽器的位址欄輸入了下面的URL:

/Home/Index/3

預設的路由将這個URL映射為下面的參數:

Controller = Home

Action = Index

id = 3

當你請求URL /Home/Index/3時,将會執行下面的代碼:

HomeController.Index(3)

Default路由包含了所有三個參數的預設值。如果你不提供控制器,那麼控制器參數預設值為Home。如果你不提供動作,動作參數預設為值Index。最後,如果你不提供id,id參數預設為空字元串。

2:建立一個自定義路由

routes.MapRoute(
                "RouteTemp", // Route name
                "Archive/{entryDate}",  // URL with parameters
                new { controller = "Archive", action = "Entry" } // Parameter defaults
            );      

上面的代碼意味着我們讓路由比對到

http://localhost:52588/Archive/1911-1-1

這樣的URL。

3:下面是設計URL路由的原則

3.1 建立簡單清晰的URL

在WEB-FORM中可能得到這樣的URL:

events_by_month.aspx/year=2008&month=4

這樣的URL沒有如下的URL好:

events/2008/04

這也叫永久URL,同樣,這也辨別了我們可以為路由動作建立多個參數。

3.2 建立可程式設計的URL

這表示删除04,能夠得到2008年的所有記錄是合理的。

3.3 允許URL參數沖突

應該能同時允許

events/someeventsname

3.4 避免暴露資料庫ID

events/17

這樣的URL可能暴露了資料庫ID,應該做簡單的處理,如

events/ID17

這也會比第一個URL要好。

3.5 考慮SEO

可以在路由中加入關鍵字,如

events/ID17/MVC

3.6 提供CATCH ALL路由

必須為所有未比對的路由添加的控制器,如下:

routes.MapRoute(
                "catch-all",
                "{*catchall}",
                new { controller = "Error", action = "NotFound" }
            );      

經過上面的處理,所有未處理的URL,都會交給ErrorController的NotFound處理,如下:

public class ErrorController : Controller
    {
        public string NotFound()
        {
            return "not found!";
        }
    }      

3.7 注意路由的次序

路由比對有先後次序,在3.6中,我們會發現,如果輸入

http://localhost:52588/xx

,結果IE顯示:

MVC TIP2:路由

檢視我們的路由設定:

MVC TIP2:路由

發現,因為URL

,被路由Default路由走了。将這個預設的路由去掉,一切就OK了。

4:路由限制

有的時候,我們需要,如下的URL

http://localhost:52588/Product/17

被路由到一個處理ID的控制器,而

http://localhost:52588/Product/Rice

則被路由到一個處理商品名稱的控制器,這就需要我們建立路由限制。如下:

routes.MapRoute(
                "Product",
                "Product/{productId}",
                new { controller = "Product", action = "Details" },
                new { productId = @"\d+" }
             );
            routes.MapRoute(
                "Product2",
                "Product/{entryArg}",
                new { controller = "Archive", action = "Entry" }
             );      

可以看到,前者我們路由到控制器ProductController,而後者則路由到了ArchiveController。

再次強調一遍,在整個項目開始以前,設計好路由是很重要的一個環節。

注意,可以使用實作IRouteConstraint接口來建立自定義路由限制,但是更建議使用像上面這樣的正則比對。

5:Views和Controllers檔案夾

這兩個檔案夾已經成為MVC的預設檔案夾,如果我們想建立頁面不受MVC控制,則需要建立另外的檔案夾。

MVC TIP2:路由

本文基于

Creative Commons Attribution 2.5 China Mainland License

釋出,歡迎轉載,演繹或用于商業目的,但是必須保留本文的署名

http://www.cnblogs.com/luminji

(包含連結)。如您有任何疑問或者授權方面的協商,請給我留言。