ASP.NET沒有魔法——ASP.NET MVC路由

来源:http://www.cnblogs.com/selimsong/archive/2017/10/17/7660176.html
-Advertisement-
Play Games

之前的文章中介紹了My Blog文章維護功能的開發,開發過程中使用Area的方法建立了用於維護文章的Controller、View和Model。但是無論代碼怎麼變對於瀏覽器來說都是通過一個url地址去訪問,現在My Blog可用的url有以下幾個: http://localhost:52356/ - ...


  之前的文章中介紹了My Blog文章維護功能的開發,開發過程中使用Area的方法建立了用於維護文章的Controller、View和Model。但是無論代碼怎麼變對於瀏覽器來說都是通過一個url地址去訪問,現在My Blog可用的url有以下幾個:
  http://localhost:52356/ -- 主頁
  http://localhost:52356/Home --主頁
  http://localhost:52356/Post --博客列表
  http://localhost:52356/Post/Get/1 --ID為1的博客內容
  http://localhost:52356/Home/About --網站關於信息

  http://localhost:52356/Admin/Home --管理首頁
  http://localhost:52356/Admin/PostManagement --管理博客列表
  http://localhost:52356/Admin/PostManagement/Update/1 --更新ID為1的博客內容
  http://localhost:52356/Admin/PostManagement/Insert --添加文章

  從上面列表可以發現可以通過兩個地址訪問主頁,但是管理主頁只有一個地址,可以像主頁一樣把Home省略掉嗎?出錯了?為什麼?而且為什麼文章添加、修改都需要Action名稱,但是列表頁的Index不需要?

  

  根據URL來決定執行哪一個控制器的活動是ASP.NET MVC的路由機制決定的,本文將從以下幾點來介紹ASP.NET的路由機制:

  ●Web伺服器靜態資源的訪問
  ●ASP.NET中的路由機制
  ●路由表
  ●路由的註冊
  ●路由註冊參數說明
  ●關於Area的路由

Web伺服器靜態資源的訪問

  當訪問一個HTTP伺服器上的靜態文件時,一般通過功能變數名稱+文件相對路徑來訪問,如最開始的使用html編寫的文章列表頁面:

  

ASP.NET中的路由機制

  在ASP.NET 提供了路由(Routing)機制,它分析url來決定將請求轉到適當的位置,不再需要指定物理位置,但是ASP.NET的三種Web框架中路由機制也主要應用於MVC框架,其餘的Web Form和Web Page常用的仍舊是通過物理地址訪問(註:ASP.NET中的三種Web框架均可使用路由)。

路由表

  ASP.NET中可以使用路由的原因是一個ASP.NET應用中有一個路由表(RouteTable),在My Blog項目中的App_Start目錄下的RouteConfig.cs文件中的註冊路由(RegisterRoutes)方法的參數就是路由表,是一個System.Web.Routing.RouteCollection類型,以下是該類型的定義:

  

  

  註:在路由表的定義中有一個MapPageRoute的方法,該方法用於給Web Forms應用註冊路由,並且從參數可以看出通過指定一個routeUrl去匹配一個物理文件路徑。

  那MVC的路由註冊方法在什麼地方?MVC的路由僅僅是路由表的一個拓展,它位於System.Web.Mvc命名空間下:

  

 

路由的註冊

  再回到RouteConfig類中註冊路由的方法,這個方法它有這樣幾個作用:

   

  1. 添加一個名稱為Default的路由條目。
  2. 路由用來匹配{controller}/{action}/{id}這種模式的url。
  3. controller和action的預設值是Home和Index,id是可選的(這裡就解釋了為什麼http://localhost:52356/ 能夠訪問到HomeController的Index Action),而且在訪問列表頁面的Index Action的時候也不需要提供,因為預設已經被設置為Index。
  4. namespaces指定了只匹配命名空間在My_Blog.Controllers下的Controller(它解決了Home Controller重名的問題)。

路由註冊參數說明

  1. name:

  路由信息的唯一標識,當註冊兩條name一致的路由會拋異常。
  2. url:

  它是一個url模板,它的格式與url一樣,通過/分隔成多個段落,每一個段落可以由文字和變數占位符構成,其中變數占位符使用花括弧{}擴住變數名稱,文字不能有特殊字元。在一個段落中可以定義多個變數,但是變數之間一定要用文字隔開,如/{controller}-{action}/是不正確的。在mvc中必要的變數有{controller}和{action},那麼{id}呢?每次創建預設MVC項目的路由註冊模板中都有id這個變數它不是必要的嗎?
  做個實驗,把url模板中的{action}變數刪除:

  

  運行程式後程式能夠運行,但是出現以下兩個問題:
  1). 使用Html.ActionLink創建的鏈接action參數失效,只生成一個空連接:

  

  

  2). 除了index action的連接都無法打開了:
  http://localhost:52356/Home/About 會被識別為http://localhost:52356/Home/ 然後加上預設的index跳轉到主頁。
  而Post沒有被設置預設參數直接無法找到:

  

  3). 當把預設action預設參數也刪除時,啟動應用程式就直接拋異常了:

  

  

  註:但是刪除{id}或者改變它的名稱都不會錯處,僅僅會影響action的參數綁定。

  3. defaults:

  路由的預設值,註意它不僅僅是路由模板的變數預設值,路由模板只是包含在路由值這個集合中,這也就是上面實驗中把url目標的action變數刪除後,它的預設值仍然有效的原有,關於路由值後面再詳細介紹。

  4. namespaces:
  一個命名空間數組,代表這個路由只匹配這些命名空間下的controller。避免多個模塊中存在同名Controller。所以如果一個應用程式存在多個模塊,那麼最好的方式就是針對每一個模塊的路由都加上自己模塊Controller的命名空間避免衝突。

  5. constraints:
  MapRoute方法中還有一個constraints參數,該參數是一個正則表達式集合,它用來驗證url中的參數是否符合表達式的要求。

關於Area的路由

  Area是MVC用來分隔功能的,通過VS來對一個MVC應用添加Area之後,會自動添加一個{Area名稱}AreaRegistration.cs的文件,該文件包含了對這個Area的路由註冊,它的url模板根據area的名稱進行了硬編碼:

  

  該路由只匹配由Admin開頭的url。
  如果存在重名可能,那麼最好添加該Area的Controller的命名空間。

如何在ASP.NET MVC中使用路由 

  上面介紹了註冊路由的方法和它的參數,並且根據示例代碼可以看出,在MVC中註冊路由只需要提供url模板和變數的預設值即可,如果應用中可能會存在同名Controller那麼只需要再加入命名空間就好,這裡就簡單總結一下:
  ● ASP.NET MVC路由的url模板必須設置{controller}和{action}變數。
  ● 路由中可以通過defaults參數對路由值(包括模板變數)設置預設值。
  ● 如果存在命名衝突可以通過namespaces數組解決。
  ● 如果使用area來分隔功能,那麼註意其自動生成的url模板,如果可能存在命名衝突,可以使用namespaces屬性解決。
  ● 路由表是有序的,當匹配到一個路由後,後續的路由將不會被匹配,所以要註意順序,以免被路由到錯誤的處理器(註:關於處理器後續文章介紹)。

小結

  本章簡單介紹了ASP.NET的路由機制,以及在MVC程式中用於註冊路由的方法和參數,並總結了路由的一些使用方法,在後續文章中將對路由的工作機制進一步介紹。

參考:

  https://msdn.microsoft.com/en-us/library/cc668201.aspx#setting_default_values_for_url_parameters

本文連接:http://www.cnblogs.com/selimsong/p/7660176.html 

ASP.NET沒有魔法——目錄


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對於QQ截圖,肯定是早就有認識了,只是一直沒有去認真觀察這個操作的具體實現步驟。所以這裡將自己的記憶中的步驟簡單的寫一下: 習慣性用QQ或者TIM的人,一般是使用Ctrl+Alt+A 快捷鍵(熱鍵)快速實現截圖。 因為考慮到截圖模式的時候 一般只能顯示一個窗體 所以就考慮使用單例模式 在Screen ...
  • http://www.cnblogs.com/shenba/archive/2011/04/16/2018441.html ...
  • 1、列舉ASP.NET頁面之間傳值的幾種方式。 答:使用QueryString,如.../id=1;response.Redirect() 使用Session 使用Server.Transfer 使用Cookie 2、簡述private、protected、public、internal修飾符的訪問 ...
  • 用法 ...
  • 對AutoMapper.Mapper.CreateMap使用不當,導致併發情況下出現異常System.NullReferenceException、System.InvalidOperationException ...
  • 上一章節中對路由的註冊和匹配過程進行了介紹,知道了MVC的Http請求最終是交由MvcHandler處理的,而其處理過程就是對Controller的創建、執行和釋放。 本章將從以下幾點進一步對上面提到的三個過程進行介紹: ● MvcHandler概述 ● ControllerBuilder&Cont ...
  • ASP.NET MVC的路由是MVC應用的一個核心也是MVC應用處理的入口,作為一個開發者,在正常情況下僅僅需要做的就是根據需求去定義實體、業務邏輯,然後在MVC的Controller中去調用、View中去展現,“路由”僅僅是定義一個路由表,使用戶在點擊一個鏈接時,應用能夠命中正確的Controll ...
  • 反射是程式猿的好幫手,有了反射你可以少寫一半的代碼。下麵是一些常用的反射擴展方法。 如有高見,歡迎交流與分享:) ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...