ASP.NET 路由

来源:https://www.cnblogs.com/MedlarCanFly/archive/2019/08/24/11402184.html

一. 什麼是路由? 一種URL(統一資源定位符)的體現方式,將URL映射到方法的調用。 轉變觀念:(URL未必是指Web伺服器上的靜態資源文件)。 二. 為什麼使用路由? 如同規範的代碼縮進一樣,這是對代碼質量的提高,是對URL的重視; 消除必須使用物理文件映射 URL 的弊端; 防止註入式攻擊,提 ...


一. 什麼是路由?

一種URL(統一資源定位符)的體現方式,將URL映射到方法的調用。

轉變觀念:(URL未必是指Web伺服器上的靜態資源文件)。

 

二. 為什麼使用路由?

  • 如同規範的代碼縮進一樣,這是對代碼質量的提高,是對URL的重視;
  • 消除必須使用物理文件映射 URL 的弊端;
  • 防止註入式攻擊,提高安全性。傳統的URL和磁碟上的內容有著直接對應的關係,通過URL就可以確定該站點的目錄結構,路由是把請求映射到控制器的操作,較為安全;
  • 可以約束URL的各個部分。

 

三. 如何定義路由?

創建一個ASP.NET MVC項目,打開應用程式文件(Global.asax.cs),可以看到在Application_Start方法中調用了RouteConfig.RegisterRoutes方法,該方法就是集中控制路由的地方。

F12轉到方法定義,它在/App_Start/RouteConfig.cs文件中。

一.特性路由

調用MapMvcAttributeRoutes()方法啟用特性路由:

特性路由,顧名思義,通過特性來定義路由。

在Controllers中添加一個空的Home控制器。

1.為方法添加一個Route特性

 

(URL為/Index的請求時,就會運行Index方法)

 

(通過 / 、/Index 都能訪問)

2.路由值(動態路由)

通過花括弧創建了一個占位符,如:/Index/xiaoming 就會匹配到這個路由。

 

問題:以下情況下' /Index '會匹配那個路由呢?

結論:靜>動

 

3.控制器路由

如果一個方法寫一個路由( [Route(ControlName/ActionName)] )的話,就會有重覆的代碼,這時候就可以在控制器(類)上添加路由特性。

使用特殊路由參數action

(可以通過 /Home/Index 、/Home/About 分別訪問Index和About方法)

 

通過=號賦值的方式為路由參數提供預設值

(請求為 /Home 時預設請求 Index)

通過?號為路由定義可選參數

 

這時候如果通過/Home/1 請求的話會提示404,因為如果URL為兩段的話它會把 ‘1’匹配到 action  。

 

4.路由約束

 

這個時候你請求' /About/2 ' 的時候就會提示請求不明確

通過約束解決

(只用當參數為int值時才會匹配第一個About)

像這樣放到路由模板中的約束叫內聯約束,還有很多:

 

二 . 傳統路由

 回到RegisterRoutes方法,清空代碼,添加一個傳統路由

controller和action是特殊參數,它們映射到控制器和方法,在傳統路由中是必須參數,沒有的話會報500的錯誤,提示不包括所需的“controller”路由值。

傳統路由有更靈活的路由語法規則

{controller}/{action}/{id}
{controller}-{action}-{id}
{controller}-{action}.{id}
...

上面這些都是有效的路由。

 

MapRoute的第三個參數由於設置預設值

        public static void RegisterRoutes(RouteCollection routes)
        {
            //映射指定的URL路由
            routes.MapRoute("simple", "{controller}/{action}/{id}",new {
                id= UrlParameter.Optional,  //設置id參數為可選參數
                action= "Index" //設置action參數的預設值為Index
            });
        }

 

 MapRoute的第四個參數由於設置路由值的約束

 

 


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

更多相關文章
  • 摘要: 在 的版本變遷過程中,註解發生了很多的變化,然而代理的設計也發生了微妙的變化,從 的`ProxyFactoryBean Spring2.x Aspectj`註解,最後到了現在廣為熟知的自動代理。 說明: 代理的相關配置類 實現了 ,封裝了對 和`Advisor`的操作 該類及其子類主要是利用 ...
  • django搭建BBS 表單創建&註冊 0824自我總結 文件結構 app 介面 migrations _\_inint\_\_.py admin.py apps.py bbsform.py models.py tests.py views.py avatar BBS \_\_inint\_\_.p ...
  • 1. Lambda簡介 可以把Lambda表達式理解為簡潔地表示可傳遞的匿名函數的一種方式:它沒有名稱,但它有參數列表、函數主體、返回類型,可能還有一個可以拋出的異常列表。 匿名——我們說匿名,是因為它不像普通的方法那樣有一個明確的名稱:寫得少而想得多! 函數——我們說它是函數,是因為Lambda函 ...
  • 在設計Web應用程式的時候,經常需要把一個系統進行結構化設計,即按照模塊進行劃分,讓不同的Servlet來實現不同的功能,例如可以讓其中一個Servlet接收用戶的請求,另外一個Servlet來處理用戶的請求。為了實現這種程式的模塊化,就需要保證在不同的Servlet之間可以相互跳轉,而Servle ...
  • 概述 前後端分離之後,因為HTTP本身是無狀態的,Session就沒法用了。項目採用jwt的方案後,請求的主要流程如下:用戶登錄成功之後,服務端會創建一個jwt的token(jwt的這個token中記錄了當前的操作賬號),並將這個token返回給前端,前端每次請求服務端的數據時,都會將令牌放入Hea ...
  • 首先我要說一下自己對自由的理解: 自由是我可以選擇不幹什麼,但我要保留我可以乾什麼的可能性。 比如說我現在只有一個碼農的角色,但我仍然要保留可以扮演其他角色的可能, 比如成為一個作者,當我寫下文章的時候已經是了,所以是知名作者(這就是努力的意義啦), 又比如我想成為一個好的架構師和好的管理者,至少在 ...
  • 出於學習的目的,然後就寫了這個 下載地址 https://gitee.com/youlicc/a_simple_reptile 下圖,效果就是這樣... 總結分析 CreateRequest.cs這個類是我自己寫的。 這個基礎類是在github上找的,地址我忘了。使用理由:這份代碼搭建了基類模型。( ...
  • 用VS2019打開VS2015創建的MVC項目時所有引用全部失效: 解決方案: 打開項目的csproj文件,刪除 Target節點,在重新打開項目。 ...
一周排行
  • C#中的DefaultView方法 簡介: 首先可建立一個表,對錶進行填充若幹條數據,代碼如下: //創建Table1 DataTable dt = new DataTable(); //對Table1添加列名,並設置列值類型 DataTable dt1 = new DataTable();//創建 ...
  • 1、運行程式報錯: FailFast: Couldn't find a valid ICU package installed on the system. 解決方法: yum install icu -y 2、程式運行後,本地可以訪問,但其他機器無法訪問,需要開放埠 firewall-cmd - ...
  • 只是一個Demo,所用有很多功能也沒有添加進去如分頁,輸入驗證,頁面也沒有進行精心佈局。 整體先來幾張圖解 ...
  • Core提供二種開發模式:Core Pages和Core MVC,今天介紹的是Core MVC。 1、創建web MVC項目 新建service/h_r.baseservice類庫文件、data/h_r.efdata類庫文件、common/h_r.common類庫文件。 引入需要的CSS文件和JS文 ...
  • 學習網址:https://docs.microsoft.com/zh-cn/visualstudio/get-started/visual-studio-ide?view=vs-2019 示範 vs2019: 變數的重命名的重構,更改該變數命名的同時,引用該變數的地方也會更改,如果該變數有被反射用到 ...
  • 1、在data裡面新建個Entity文件用於存放表映射,設計資料庫,執行如下語句 Scaffold-DbContext -Force "server=.;user=sunyong;password=1qaz!QAZ;database=hr;" Microsoft.EntityFrameworkCor ...
  • 1、發送郵件類,百度一大堆,這裡用的也是直接百度拿過來的 public static bool get_send_email(email email, string Title, string Body) { MailMessage mailMsg = new MailMessage(); mail ...
  • 1、添加用戶列表控制器,用於用戶列表顯示,登錄,增刪改查,郵件發送,下載 public userlistController(MainDbContext _db, ILogger<operatorlog> _logger, IOptions<email> sendMail) { db = _db; ...
  • 1、用戶列表頁面 @{ Layout = Layout = null;}<table id="datalistuser" class="easyui-datagrid" url="/userlist/getuserlist" toolbar="#toolbaruser" rownumbers="tr ...
  • 1、引用包 Microsoft.EntityFrameworkCore.Tools Microsoft.EntityFrameworkCore.SqlServer Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation Microsoft.AspNetCo ...