中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ASP.NET MVC中路由的示例分析

發布時間:2021-01-30 10:05:06 來源:億速云 閱讀:172 作者:小新 欄目:編程語言

這篇文章主要介紹了ASP.NET MVC中路由的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

理解默認路由表

當你創建一個新的ASP.NET MVC應用程序時,應用程序已經被配置為使用ASP.NET路由.ASP.NET路由在兩個地方設置。

第一點,在你的應用程序的Web配置文件(Web.config文件文件)中啟用ASP.NET路由在配置文件中有四個節點與路由有關:sytem.web.httpModules節,system.web.httpHandlers節,system.webserver.modules節,以及system.webserver.handlers節。特別要小心不要刪除了這些節點,因為沒有它們路由將不能工作。

第二點,也是更為重要的一點,在應用程序的Global.asax中文件中創建了一個路由表.Global.asax文件是一個特殊的文件,它包含了作用于ASP.NET應用程序生命周期事件的事件處理程序。路由表在應用程序開始事件期間創建。

代碼清單1中的文件包含了一個ASP.NET MVC應用程序的默認Global.asax文件。

代碼清單1 - Global.asax.cs

使用系統; 
使用 System.Collections.Generic; 
使用 System.Linq; 
使用 System.Web; 
使用 System.Web.Mvc; 
使用 System.Web.Routing; 
命名空間 MvcApplication1
{
    //注意:有關啟用IIS6或IIS7經典模式的說明,
    請訪問http://go.microsoft.com/?LinkId=9394801 
    public class MvcApplication:System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection路由)
        {
            routes.IgnoreRoute( “{resource} .axd / {* pathInfo}”); 
            路線。
                MapRoute( “Default”,                                              // Route name 
                “{controller} / {action} / {id}”,                           //具有參數
                的URL new {controller = “Home”,action =“Index”,id =“” } //參數默認值
            ); 
        }
        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes); 
        }
    }
} //具有參數的URL new {controller = “Home”,action =“Index”,id =“” } //參數defaults); } protected void Application_Start(){RegisterRoutes(RouteTable.Routes); }}} //具有參數的URL new {controller = “Home”,action =“Index”,id =“” }  //參數defaults); } protected void Application_Start(){RegisterRoutes(RouteTable.Routes); }}} } protected void Application_Start(){RegisterRoutes(RouteTable.Routes); }}} } protected void Application_Start(){RegisterRoutes(RouteTable.Routes); }}}

當一個MVC應用程序首次運行時,會調用的Application_Start()方法。這個方法隨后調用了的RegisterRoutes()方法.RegisterRoutes()方法創建了路由表。

默認的路由表包含了一個路由(名叫默認).DEFAULT路由將URL的第一部分映射到控制器名,URL的第二部分映射到控制器動作,第三個部分映射到一個叫做ID的參數。

假設你在瀏覽器的地址欄輸入了下面的網址:

/首頁/索引/ 3

默認的路由將這個URL映射為下面的參數:

控制器=首頁

Action = Index

id = 3

當你請求URL /首頁/索引/ 3時,將會執行下面的代碼:

HomeController.Index(3)

默認路由包含了所有三個參數的默認值。如果你不提供控制器,那么控制器參數默認值為首頁。如果你不提供動作,動作參數默認為值指標。最后,如果你不提供ID,ID參數默認為空字符串。

讓我們看看幾個例子,默認路由是如何將URL映射到控制器動作的設想你在瀏覽器地址欄輸入了下面的網址:

/家

由于缺省路由參數的默認值,輸入這個網址將會調用代碼清單2中的HomeController的類的指數()方法。

代碼清單2 - HomeController.cs

使用 System.Web.Mvc; 
命名空間 MvcApplication1.Controllers 
{ 
    [HandleError] 
    public class HomeController:Controller 
    { 
        public ActionResult Index(string id)
        { 
            return View(); 
        } 
    } 
}

在代碼清單2中,HomeController類包含了一個叫做Index()的方法,它接受一個叫做Id的參數.URL / Home將會導致調用Index()方法,并使空字符串作為Id參數的值。

出于MVC框架調用控制器動作的方式,URL / Home也匹配代碼清單3中HomeController類的索引()方法。

代碼清單3 - HomeController.cs(不含參數的索引動作)

使用 System.Web.Mvc; 
命名空間 MvcApplication1.Controllers 
{ 
    [HandleError] 
    public class HomeController:Controller 
    { 
        public ActionResult Index()
        { 
            return View(); 
        } 
    } 
}

代碼清單3中的Index()方法不接受任何的參數.URL / Home將會導致調用這個Index()方法.URL / Home / Index / 3也會調用這個方法(Id被忽略)。

URL / Home也會匹配代碼清單4中HomeController類的索引()方法。

代碼清單4 - HomeController.cs(使用可空參數的索引動作)

使用 System.Web.Mvc; 
命名空間 MvcApplication1.Controllers 
{ 
    [HandleError] 
    public class HomeController:Controller 
    { 
        public ActionResult Index(int?id)
        { 
            return View(); 
        } 
    } 
}

在代碼清單4中,索引()方法擁有一個整數參數。因為這個參數是一個可空參數(可以擁有空值),因此可以調用指數()而不會引發錯誤。

最后,使用URL / Home調用代碼清單5中的Index()方法將會引發一個異常,因為Id參數并非一個可空參數。如果你試圖調用Index()方法,那么你將會獲得一個圖1中所示的錯誤。

代碼清單5 - HomeController.cs(含有Id參數的索引動作)

使用 System.Web.Mvc; 
命名空間 MvcApplication1.Controllers 
{ 
    [HandleError] 
    public class HomeController:Controller 
    { 
        public ActionResult Index(int id)
        { 
            return View(); 
        } 
    } 
}

ASP.NET MVC中路由的示例分析

圖01:調用一個期望參數值的控制器動作

另一方面,URL / Home / Index / 3能夠與代碼清單5中的索引控制器動作很好地工作./Home/Index/3請求將會引發調用含有一個Id的索引()方法,且該Id值為3。

這篇教程的目的是為你提供一個ASP.NET路由的簡短介紹。我們仔細查看了默認的路由表,它在你創建新的ASP.NET MVC應用程序時獲得。你學習了默認的路由表如何將URL映射到控制器動作。

2.創建自定義路由

在這篇教程中,你會學習到如何為ASP.NET MVC應用程序添加自定義路由。你會學習如何將Global.asax文件中的默認路由表修改為自定義路由。

對于簡單的ASP.NET MVC應用程序,默認的路由表已經可以很好的完成工作了。然而,你可以發現會存在特定的路由需求在這種情況下,你可以創建一個自定義路由。

設想一下,舉個例子,你正在創建一個博客應用程序你可能想要像這樣處理即將到來的請求:

/存檔/ 2009年12月25日

當用戶輸入這一請求,你想要返回對應于日期2009年12月25日的博客條目。為了處理這種類型的請求,你需要創建一個自定義路由。

代碼清單1中的Global.asax包含了一個新的自定義路由,命名為了博客,它處理了類似/存檔/條目日期這樣的請求。

代碼清單1 - Global.asax(含有自定義路由)

使用 System.Web.Mvc; 
使用 System.Web.Routing; 
命名空間 MvcApplication1 
{ 
    public class MvcApplication:System.Web.HttpApplication 
    { 
        public static void RegisterRoutes(RouteCollection routes)
        { 
            routes.IgnoreRoute(“{resource} .axd / {* pathInfo}”); 
            routes.MapRoute(
                “Blog”,                                           //路由名稱
                “Archive / {entryDate}”,                            //具有參數
                的URL new {controller = “Archive”,action =“ } //參數defaults
            ); 
            routes.MapRoute(
                “Default”,//路由名稱
                “{controller} / {action} / {id}”,//具有參數
                的URL new {controller = “Home”,action =“Index”,id =“” } //參數defaults
            ); 
        } 
        protected void Application_Start()
        { 
            RegisterRoutes(RouteTable.Routes); 
        } 
    } 
} }  //參數defaults); routes.MapRoute(“Default”,//路由名稱“{controller} / {action} / {id}”,//具有參數的URL new {controller = “Home”,action =“Index”,id =“” } //參數defaults); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } } ,//路由名稱“{controller} / {action} / {id}”,//具有參數的URL new {controller = “Home”,action =“Index”,id =“” } //參數defaults); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } } ,                                              //路由名稱“{controller} / {action} / {id}”,                           //具有參數的URL new {controller = “Home”,action =“Index”,id =“” } //參數defaults); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } } //具有參數的URL new {controller = “Home”,action =“Index”,id =“” } //參數defaults); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } } //具有參數的URL new {controller = “Home”,action =“Index”,id =“” }  //參數defaults); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } }

添加到路由表中的路由順序非常重要。我們的新自定義博客路由在現有的默認路由前面。如果你將這個順序顛倒過來,那么默認路由將總是被調用,而不是自定義路由。

自定義博客路由匹配任何以/存檔/作為開始的請求因此,它匹配所有下面的網址:

/存檔/ 2009年12月25日

/存檔/ 2004年10月6日

/存檔/蘋果

自定義路由將即將到來的請求映射到名為存檔的控制器,并且調用了條目()動作。當調用項()方法時,條目日期作為entryDate參數進行了傳遞。

代碼清單2 - ArchiveController.cs

使用系統; 
使用 System.Web.Mvc; 
命名空間 MvcApplication1.Controllers
{
    public class ArchiveController:Controller
    {
        public string Entry(DateTime entryDate)
        {
            return “您從” + entryDate.ToString())請求了條目。
        }
    }
}

注意到代碼清單2中的條目()方法接受一個日期時間類型的參數.MVC框架非常的聰明,足以自動地將URL中的條目日期轉換為日期時間值。如果URL中的條目日期參數不能轉換為日期時間,將會引發錯誤(如圖1)。

圖1 - 轉換參數時的錯誤

ASP.NET MVC中路由的示例分析

這篇教程的目的是演示如何創建自定義路由。你學習了如何在Global.asax中文件的路由表中添加自定義路由,該路由代表著博客條目。我們討論了如何將對博客條目的請求映射到名為ArchiveController的控制器,和名為項()的控制器動作上。

3.創建路由約束

你可以使用路由約束來限制匹配特定路由的瀏覽器請求。可以使用正則表達式來指定一個路由約束。

舉個例子,假設你已經在Global.asax中文件中定義了一個路由。

代碼清單1 - Global.asax.cs

routes.MapRoute(
    “Product”,
    “Product / {productId}”,
    new {controller =“Product”,action =“Details”} 
);

代碼清單1包含一個叫做產品的路由。你可以使用產品路由將瀏覽器請求映射到代碼清單2中的ProductController的。

代碼清單2 - Controllers \ ProductController.cs

使用 System.Web.Mvc; 
命名空間 MvcApplication1.Controllers 
{ 
    public class ProductController:Controller 
    { 
        public ActionResult Details(int productId)
        { 
            return View(); 
        } 
    } 
}

注意到產品控制器公布的詳細信息()動作接受一個叫做的productId的參數。這個參數是一個整數參數。

定義在代碼清單1中的路由將會匹配下面的任意網址:

/產品/ 23
/產品/ 7
不幸的是,路由也會匹配下面的網址:
/產品/嗒嗒
/產品/蘋果

因為詳細()動作期望的是一個整數值,發起一個含有非整數值的請求將會導致錯誤。舉個例子,如果你在瀏覽器中輸入/產品/蘋果網址,那么你將會得到圖1所示的錯誤頁。

ASP.NET MVC中路由的示例分析

圖1:錯誤頁

你實際想做的是只匹配包含合適整數productId參數的URL。當定義路由來限制與路由相匹配的網址時,你可以使用約束。代碼3中的修改后的產品路由包含了一個正則表達式,它限制了只匹配數字。

代碼清單3 - Global.asax.cs

routes.MapRoute(
    “Product”,
    “Product / {productId}”,
    new {controller =“Product”,action =“Details”},
    new {productId = @“\ d +”} 
 )

正則表達式\ D +匹配一個或多個整數這個限制使得產品路由匹配了下面的網址:

/產品/ 3
/產品/ 8999
但是不匹配下面的網址:
/產品/蘋果
/產品

這些瀏覽器請求將自由另外的路由處理,或者,如果沒有匹配的路由,將會返回一個“資源找不到”錯誤。

創建一個自定義路由約束

這篇教程的目標是演示如何創建一個自定義路由約束。自定義路由約束允許你阻止某個路徑被匹配,除非滿足一些自定義的條件。

在這篇教程中,我們創建了一個本地主機路由約束.Localhost路由約束只匹配本地計算機發出的請求。通過互聯網發出的遠程請求不會被匹配。

。你可以通過實現IRouteConstraint接口來實現一個自定義路由這是一個極其簡單的接口,它只描述了一個方法:

bool Match(
    HttpContextBase httpContext,
    Route route,
    string parameterName,
    RouteValueDictionary值,
    RouteDirection routeDirection 
)

這個方法返回一個布爾值。如果返回了假,與約束相關聯的路由將不會匹配瀏覽器請求。

本地主機約束包含在了代碼清單1中。

代碼清單1 - LocalhostConstraint.cs

使用 System.Web; 
使用 System.Web.Routing; 
命名空間 MvcApplication1.Constraints 
{ 
    public class LocalhostConstraint:IRouteConstraint 
    { 
        public bool Match 
            (
                HttpContextBase httpContext,
                Route route,
                string parameterName,
                RouteValueDictionary values,
                RouteDirection routeDirection 
            )
        { 
            return httpContext.Request.IsLocal; 
        } 
    } 
}

代碼清單1中的約束利用了HttpRequest的類公布的IsLocal屬性。當發出請求的IP地址是127.0.0.1或者與服務器的IP地址相同時,這個屬性返回真。

你在定義于Global.asax中的路由中使用了自定義約束。代碼清單2中的Global.asax中文件使用了本地主機約束來阻止任何人請求管理員頁面,除非他們從本地服務器發出請求。舉個例子,當請求來自遠程服務器時,對于/管理/ DeleteAll的請求將會失敗。

代碼清單2 - Global.asax

使用系統; 
使用 System.Collections.Generic; 
使用 System.Linq; 
使用 System.Web; 
使用 System.Web.Mvc; 
使用 System.Web.Routing; 
使用 MvcApplication1.Constraints; 
命名空間 MvcApplication1
{
    public class MvcApplication:System.Web.HttpApplication
    {
         public static void RegisterRoutes(RouteCollection routes){
            routes.IgnoreRoute( “{resource} .axd / {* pathInfo}”); 
            routes.MapRoute(
                “Admin”,
                “Admin / {action}”,
                
                isLocal = new LocalhostConstraint()} 
            ); 
            //routes.MapRoute(
            //    “默認”,//路線名稱
            //    “{控制器} / {行動} /(編號)”,// URL與參數
            //    新 {控制器= “主頁”,動作=“索引“,id =”“ } //參數defaults 
            //); 
        } 
        protected void Application_Start(){ 
            RegisterRoutes(RouteTable.Routes); 
        } 
    } 
}

本地主機約束使用在了管理路由的定義中這個路由不會被遠程瀏覽器請求所匹配然而,應該意識到定義在Global.asax中中的其他路由可能會匹配相同的請求理解這一點很重要。:約束阻止了特定路由匹配某一請求,而不是所有定義在Global.asax中文件中的路由。

注意到默認路由在代碼清單2中的Glabal.asax文件中被注釋掉了。如果你包含默認路由,那么默認路由將會匹配對管理控制器的請求。在這種情況下,遠程用戶仍然可以調用管理控制器的動作,即使他們的請求不匹配管理路由。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“ASP.NET MVC中路由的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁明县| 高淳县| 惠水县| 左云县| 珠海市| 廉江市| 平果县| 应城市| 肃宁县| 桂平市| 满洲里市| 甘德县| 基隆市| 漳州市| 罗平县| 得荣县| 涟源市| 大化| 唐河县| 华坪县| 景德镇市| 罗平县| 石泉县| 中超| 女性| 河曲县| 博爱县| 汉寿县| 宜州市| 英山县| 汨罗市| 商河县| 和林格尔县| 秦皇岛市| 乐东| 渝北区| 肥城市| 新宾| 郎溪县| 玛沁县| 东至县|