真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

ASP.NETMVC中路由的示例分析-創(chuàng)新互聯(lián)

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

創(chuàng)新互聯(lián)公司是一家網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè),提供網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),網(wǎng)站制作,建網(wǎng)站,按需網(wǎng)站開(kāi)發(fā),網(wǎng)站開(kāi)發(fā)公司,2013年開(kāi)創(chuàng)至今是互聯(lián)行業(yè)建設(shè)者,服務(wù)者。以提升客戶(hù)品牌價(jià)值為核心業(yè)務(wù),全程參與項(xiàng)目的網(wǎng)站策劃設(shè)計(jì)制作,前端開(kāi)發(fā),后臺(tái)程序制作以及后期項(xiàng)目運(yùn)營(yíng)并提出專(zhuān)業(yè)建議和思路。

理解默認(rèn)路由表

當(dāng)你創(chuàng)建一個(gè)新的ASP.NET MVC應(yīng)用程序時(shí),應(yīng)用程序已經(jīng)被配置為使用ASP.NET路由.ASP.NET路由在兩個(gè)地方設(shè)置。

第一點(diǎn),在你的應(yīng)用程序的Web配置文件(Web.config文件文件)中啟用ASP.NET路由在配置文件中有四個(gè)節(jié)點(diǎn)與路由有關(guān):sytem.web.httpModules節(jié),system.web.httpHandlers節(jié),system.webserver.modules節(jié),以及system.webserver.handlers節(jié)。特別要小心不要?jiǎng)h除了這些節(jié)點(diǎn),因?yàn)闆](méi)有它們路由將不能工作。

第二點(diǎn),也是更為重要的一點(diǎn),在應(yīng)用程序的Global.asax中文件中創(chuàng)建了一個(gè)路由表.Global.asax文件是一個(gè)特殊的文件,它包含了作用于ASP.NET應(yīng)用程序生命周期事件的事件處理程序。路由表在應(yīng)用程序開(kāi)始事件期間創(chuàng)建。

代碼清單1中的文件包含了一個(gè)ASP.NET MVC應(yīng)用程序的默認(rèn)Global.asax文件。

代碼清單1 - Global.asax.cs

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

當(dāng)一個(gè)MVC應(yīng)用程序首次運(yùn)行時(shí),會(huì)調(diào)用的Application_Start()方法。這個(gè)方法隨后調(diào)用了的RegisterRoutes()方法.RegisterRoutes()方法創(chuàng)建了路由表。

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

假設(shè)你在瀏覽器的地址欄輸入了下面的網(wǎng)址:

/首頁(yè)/索引/ 3

默認(rèn)的路由將這個(gè)URL映射為下面的參數(shù):

控制器=首頁(yè)

Action = Index

id = 3

當(dāng)你請(qǐng)求URL /首頁(yè)/索引/ 3時(shí),將會(huì)執(zhí)行下面的代碼:

HomeController.Index(3)

默認(rèn)路由包含了所有三個(gè)參數(shù)的默認(rèn)值。如果你不提供控制器,那么控制器參數(shù)默認(rèn)值為首頁(yè)。如果你不提供動(dòng)作,動(dòng)作參數(shù)默認(rèn)為值指標(biāo)。最后,如果你不提供ID,ID參數(shù)默認(rèn)為空字符串。

讓我們看看幾個(gè)例子,默認(rèn)路由是如何將URL映射到控制器動(dòng)作的設(shè)想你在瀏覽器地址欄輸入了下面的網(wǎng)址:

/家

由于缺省路由參數(shù)的默認(rèn)值,輸入這個(gè)網(wǎng)址將會(huì)調(diào)用代碼清單2中的HomeController的類(lèi)的指數(shù)()方法。

代碼清單2 - HomeController.cs

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

在代碼清單2中,HomeController類(lèi)包含了一個(gè)叫做Index()的方法,它接受一個(gè)叫做Id的參數(shù).URL / Home將會(huì)導(dǎo)致調(diào)用Index()方法,并使空字符串作為Id參數(shù)的值。

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

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

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

代碼清單3中的Index()方法不接受任何的參數(shù).URL / Home將會(huì)導(dǎo)致調(diào)用這個(gè)Index()方法.URL / Home / Index / 3也會(huì)調(diào)用這個(gè)方法(Id被忽略)。

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

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

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

在代碼清單4中,索引()方法擁有一個(gè)整數(shù)參數(shù)。因?yàn)檫@個(gè)參數(shù)是一個(gè)可空參數(shù)(可以擁有空值),因此可以調(diào)用指數(shù)()而不會(huì)引發(fā)錯(cuò)誤。

最后,使用URL / Home調(diào)用代碼清單5中的Index()方法將會(huì)引發(fā)一個(gè)異常,因?yàn)镮d參數(shù)并非一個(gè)可空參數(shù)。如果你試圖調(diào)用Index()方法,那么你將會(huì)獲得一個(gè)圖1中所示的錯(cuò)誤。

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

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

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

圖01:調(diào)用一個(gè)期望參數(shù)值的控制器動(dòng)作

另一方面,URL / Home / Index / 3能夠與代碼清單5中的索引控制器動(dòng)作很好地工作./Home/Index/3請(qǐng)求將會(huì)引發(fā)調(diào)用含有一個(gè)Id的索引()方法,且該Id值為3。

這篇教程的目的是為你提供一個(gè)ASP.NET路由的簡(jiǎn)短介紹。我們仔細(xì)查看了默認(rèn)的路由表,它在你創(chuàng)建新的ASP.NET MVC應(yīng)用程序時(shí)獲得。你學(xué)習(xí)了默認(rèn)的路由表如何將URL映射到控制器動(dòng)作。

2.創(chuàng)建自定義路由

在這篇教程中,你會(huì)學(xué)習(xí)到如何為ASP.NET MVC應(yīng)用程序添加自定義路由。你會(huì)學(xué)習(xí)如何將Global.asax文件中的默認(rèn)路由表修改為自定義路由。

對(duì)于簡(jiǎn)單的ASP.NET MVC應(yīng)用程序,默認(rèn)的路由表已經(jīng)可以很好的完成工作了。然而,你可以發(fā)現(xiàn)會(huì)存在特定的路由需求在這種情況下,你可以創(chuàng)建一個(gè)自定義路由。

設(shè)想一下,舉個(gè)例子,你正在創(chuàng)建一個(gè)博客應(yīng)用程序你可能想要像這樣處理即將到來(lái)的請(qǐng)求:

/存檔/ 2009年12月25日

當(dāng)用戶(hù)輸入這一請(qǐng)求,你想要返回對(duì)應(yīng)于日期2009年12月25日的博客條目。為了處理這種類(lèi)型的請(qǐng)求,你需要?jiǎng)?chuàng)建一個(gè)自定義路由。

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

代碼清單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”,                                           //路由名稱(chēng)
                “Archive / {entryDate}”,                            //具有參數(shù)
                的URL new {controller = “Archive”,action =“ } //參數(shù)defaults
            ); 
            routes.MapRoute(
                “Default”,//路由名稱(chēng)
                “{controller} / {action} / {id}”,//具有參數(shù)
                的URL new {controller = “Home”,action =“Index”,id =“” } //參數(shù)defaults
            ); 
        } 
        protected void Application_Start()
        { 
            RegisterRoutes(RouteTable.Routes); 
        } 
    } 
} }  //參數(shù)defaults); routes.MapRoute(“Default”,//路由名稱(chēng)“{controller} / {action} / {id}”,//具有參數(shù)的URL new {controller = “Home”,action =“Index”,id =“” } //參數(shù)defaults); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } } ,//路由名稱(chēng)“{controller} / {action} / {id}”,//具有參數(shù)的URL new {controller = “Home”,action =“Index”,id =“” } //參數(shù)defaults); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } } ,                                              //路由名稱(chēng)“{controller} / {action} / {id}”,                           //具有參數(shù)的URL new {controller = “Home”,action =“Index”,id =“” } //參數(shù)defaults); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } } //具有參數(shù)的URL new {controller = “Home”,action =“Index”,id =“” } //參數(shù)defaults); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } } //具有參數(shù)的URL new {controller = “Home”,action =“Index”,id =“” }  //參數(shù)defaults); } protected void Application_Start(){ RegisterRoutes(RouteTable.Routes); } } }

添加到路由表中的路由順序非常重要。我們的新自定義博客路由在現(xiàn)有的默認(rèn)路由前面。如果你將這個(gè)順序顛倒過(guò)來(lái),那么默認(rèn)路由將總是被調(diào)用,而不是自定義路由。

自定義博客路由匹配任何以/存檔/作為開(kāi)始的請(qǐng)求因此,它匹配所有下面的網(wǎng)址:

/存檔/ 2009年12月25日

/存檔/ 2004年10月6日

/存檔/蘋(píng)果

自定義路由將即將到來(lái)的請(qǐng)求映射到名為存檔的控制器,并且調(diào)用了條目()動(dòng)作。當(dāng)調(diào)用項(xiàng)()方法時(shí),條目日期作為entryDate參數(shù)進(jìn)行了傳遞。

代碼清單2 - ArchiveController.cs

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

注意到代碼清單2中的條目()方法接受一個(gè)日期時(shí)間類(lèi)型的參數(shù).MVC框架非常的聰明,足以自動(dòng)地將URL中的條目日期轉(zhuǎn)換為日期時(shí)間值。如果URL中的條目日期參數(shù)不能轉(zhuǎn)換為日期時(shí)間,將會(huì)引發(fā)錯(cuò)誤(如圖1)。

圖1 - 轉(zhuǎn)換參數(shù)時(shí)的錯(cuò)誤

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

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

3.創(chuàng)建路由約束

你可以使用路由約束來(lái)限制匹配特定路由的瀏覽器請(qǐng)求??梢允褂谜齽t表達(dá)式來(lái)指定一個(gè)路由約束。

舉個(gè)例子,假設(shè)你已經(jīng)在Global.asax中文件中定義了一個(gè)路由。

代碼清單1 - Global.asax.cs

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

代碼清單1包含一個(gè)叫做產(chǎn)品的路由。你可以使用產(chǎn)品路由將瀏覽器請(qǐng)求映射到代碼清單2中的ProductController的。

代碼清單2 - Controllers \ ProductController.cs

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

注意到產(chǎn)品控制器公布的詳細(xì)信息()動(dòng)作接受一個(gè)叫做的productId的參數(shù)。這個(gè)參數(shù)是一個(gè)整數(shù)參數(shù)。

定義在代碼清單1中的路由將會(huì)匹配下面的任意網(wǎng)址:

/產(chǎn)品/ 23
/產(chǎn)品/ 7
不幸的是,路由也會(huì)匹配下面的網(wǎng)址:
/產(chǎn)品/嗒嗒
/產(chǎn)品/蘋(píng)果

因?yàn)樵敿?xì)()動(dòng)作期望的是一個(gè)整數(shù)值,發(fā)起一個(gè)含有非整數(shù)值的請(qǐng)求將會(huì)導(dǎo)致錯(cuò)誤。舉個(gè)例子,如果你在瀏覽器中輸入/產(chǎn)品/蘋(píng)果網(wǎng)址,那么你將會(huì)得到圖1所示的錯(cuò)誤頁(yè)。

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

圖1:錯(cuò)誤頁(yè)

你實(shí)際想做的是只匹配包含合適整數(shù)productId參數(shù)的URL。當(dāng)定義路由來(lái)限制與路由相匹配的網(wǎng)址時(shí),你可以使用約束。代碼3中的修改后的產(chǎn)品路由包含了一個(gè)正則表達(dá)式,它限制了只匹配數(shù)字。

代碼清單3 - Global.asax.cs

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

正則表達(dá)式\ D +匹配一個(gè)或多個(gè)整數(shù)這個(gè)限制使得產(chǎn)品路由匹配了下面的網(wǎng)址:

/產(chǎn)品/ 3
/產(chǎn)品/ 8999
但是不匹配下面的網(wǎng)址:
/產(chǎn)品/蘋(píng)果
/產(chǎn)品

這些瀏覽器請(qǐng)求將自由另外的路由處理,或者,如果沒(méi)有匹配的路由,將會(huì)返回一個(gè)“資源找不到”錯(cuò)誤。

創(chuàng)建一個(gè)自定義路由約束

這篇教程的目標(biāo)是演示如何創(chuàng)建一個(gè)自定義路由約束。自定義路由約束允許你阻止某個(gè)路徑被匹配,除非滿(mǎn)足一些自定義的條件。

在這篇教程中,我們創(chuàng)建了一個(gè)本地主機(jī)路由約束.Localhost路由約束只匹配本地計(jì)算機(jī)發(fā)出的請(qǐng)求。通過(guò)互聯(lián)網(wǎng)發(fā)出的遠(yuǎn)程請(qǐng)求不會(huì)被匹配。

。你可以通過(guò)實(shí)現(xiàn)IRouteConstraint接口來(lái)實(shí)現(xiàn)一個(gè)自定義路由這是一個(gè)極其簡(jiǎn)單的接口,它只描述了一個(gè)方法:

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

這個(gè)方法返回一個(gè)布爾值。如果返回了假,與約束相關(guān)聯(lián)的路由將不會(huì)匹配瀏覽器請(qǐng)求。

本地主機(jī)約束包含在了代碼清單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的類(lèi)公布的IsLocal屬性。當(dāng)發(fā)出請(qǐng)求的IP地址是127.0.0.1或者與服務(wù)器的IP地址相同時(shí),這個(gè)屬性返回真。

你在定義于Global.asax中的路由中使用了自定義約束。代碼清單2中的Global.asax中文件使用了本地主機(jī)約束來(lái)阻止任何人請(qǐng)求管理員頁(yè)面,除非他們從本地服務(wù)器發(fā)出請(qǐng)求。舉個(gè)例子,當(dāng)請(qǐng)求來(lái)自遠(yuǎn)程服務(wù)器時(shí),對(duì)于/管理/ DeleteAll的請(qǐng)求將會(huì)失敗。

代碼清單2 - Global.asax

使用系統(tǒng); 
使用 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(
            //    “默認(rèn)”,//路線(xiàn)名稱(chēng)
            //    “{控制器} / {行動(dòng)} /(編號(hào))”,// URL與參數(shù)
            //    新 {控制器= “主頁(yè)”,動(dòng)作=“索引“,id =”“ } //參數(shù)defaults 
            //); 
        } 
        protected void Application_Start(){ 
            RegisterRoutes(RouteTable.Routes); 
        } 
    } 
}

本地主機(jī)約束使用在了管理路由的定義中這個(gè)路由不會(huì)被遠(yuǎn)程瀏覽器請(qǐng)求所匹配然而,應(yīng)該意識(shí)到定義在Global.asax中中的其他路由可能會(huì)匹配相同的請(qǐng)求理解這一點(diǎn)很重要。:約束阻止了特定路由匹配某一請(qǐng)求,而不是所有定義在Global.asax中文件中的路由。

注意到默認(rèn)路由在代碼清單2中的Glabal.asax文件中被注釋掉了。如果你包含默認(rèn)路由,那么默認(rèn)路由將會(huì)匹配對(duì)管理控制器的請(qǐng)求。在這種情況下,遠(yuǎn)程用戶(hù)仍然可以調(diào)用管理控制器的動(dòng)作,即使他們的請(qǐng)求不匹配管理路由。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“ASP.NET MVC中路由的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!


分享文章:ASP.NETMVC中路由的示例分析-創(chuàng)新互聯(lián)
文章鏈接:http://weahome.cn/article/icjdd.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部