亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

解讀ASP.NET 5 & MVC6系列(11):Routing路由

2019-11-17 02:07:24
字體:
來源:轉載
供稿:網友

解讀asp.net 5 & MVC6系列(11):Routing路由

2015-05-26 09:07 by 湯姆大叔, ... 閱讀, ... 評論, 收藏, 編輯

新版Routing功能介紹

在ASP.NET 5和MVC6中,Routing功能被全部重寫了,雖然用法有些類似,但和之前的Routing原理完全不太一樣了,該Routing框架不僅可以支持MVC和Web API,還支持一般的ASP.NET5程序。新版的改變有如下幾個部分。

首先,Routing系統是基于ASP.NET 5的,是一個獨立于MVC的路由框架,而不是基于MVC的。MVC只是在上面擴展了一個快捷方式而已。

其次,在ASP.NET 5中,MVC和Web API控制器沒有區別了,即合二為一了。兩者派生于同一個Controller基類。也就是說該Routing框架是適用于兩者的,適用于MVC則意味著也適用于Web API。

最后,不管在基于約定的Route聲明還是基于Attribute的Route聲明,都可以使用內聯約束和參數選項。例如,你可以約定路由中某個參數的數據類型,也可以讓一個參數標記為可選類型,再或者給其提供一個默認值。

Routing框架的主要流程

基本的Routing框架是基于Middleware來實現的,這樣就可以將其添加到HTTP的請求Pipeline中了,它可以喝其它任意Middleware一起進行組合使用,如靜態文件處理程序、錯誤頁、或者SignalR服務器。

在使用Routing框架之前,首要要了解Routing的作用,作用很簡單:

  1. 對于HTTP請求,Routing系統負責找出與之匹配的route,創建route數據,并將該請求派送到該route對于的處理程序(Handler)上。
  2. Controller和Action的選擇,只是MVC的Handler的一個具體實現,該實現使用route數據和HTTP請求中的其它信息來選擇要執行的Controller和Action。在新版的MVC6中,該處理程序的名稱為MvcRouteHandler。

路由系統的執行流程如下:

  1. ASP.NET 5監聽到一個HTTP請求。然后Routing Middleware就會嘗試將route集合中的route匹配該請求。
  2. 一旦成功匹配一個請求,就找出該route對應的handler。
  3. 調用該handler上的RouteAsync方法(因為所有的handler都要實現該接口方法)。
  4. RoutingContext有一個IsHandled標記,如果該標記設置為true,則意味著該請求已經被這個handler成功處理了;如果設置為false,則意味著該handler無法處理該請求,系統會再為此匹配一個route。

和之前的Routing系統有點不同的是,老版的Routing系統一旦成功匹配一個路由,就將其交由其對應的Handler,不管對應的Handler能不能處理該請求,所以就會出現route匹配成功了,但是找不到對應的action,此時就會出現404錯誤,而新版對此作出了上述第4步驟的改進(重新將控制權交回給Routing系統,進行重新匹配),看起來還是非常不錯的。

Route參數和約束條件的改進

在之前的route設置中,要約束一個參數的數據類型的話,我們需要使用類型如下代碼:

routes.MaPRoute(    "Product",     "Product/{productId}",     defaults: new { controller = "Product", action = "Details" },    constraints: new { productId = @"/d+" });

而在新版route中,就可以直接設置Product/{productId:int}了,約束條件遵守如下約定:

{parameter:constraint}

目前支持的約束如下:

約束示例說明
required"Product/{ProductName:required}"參數必選
alpha"Product/{ProductName:alpha}"匹配字母,大小寫不限
int"Product/{ProductId:int}"匹配int類型
long"Product/{ProductId:long}"匹配long類型
bool"Product/{ProductId:bool}"匹配bool類型
double"Product/{ProductId:double}"匹配double類型
float"Product/{ProductId:float}"匹配float類型
guid"Product/{ProductId:guid}"匹配guid類型
decimal"Product/{ProductId:decimal}"匹配decimal類型
datetime"Search/{datetime:datetime}"匹配datetime類型
composite"Product/{ProductId:composite}"匹配composite類型
length"Product/{ProductName:length(5)}"長度必須是5個字符
length"Product/{ProductName:length(5, 10)}"長度在5-10個之間
maxlength"Product/{productId:maxlength(10)}"最大長度為10
minlength"Product/{productId:minlength(3)}"最小長度為3
min"Product/{ProductID:min(3)}"大于等于3
max"Product/{ProductID:max(10)}"小于等于10
range"Product/{ProductID:range(5, 10)}"對應的數組在5-10之間
Regex"Product/{productId:regex(^/d{4}$)}"符合指定的正則表達式

而對于可選參數,則值需要在約束類型后面加一個問號即可,示例如下:

routes.MapRoute(    "Product",     "Product/{productId:long?}",     new { controller = "Product", action = "Details" });

如果參數是必填的,需要保留一個默認值的話,則可以按照如下示例進行設置:

routes.MapRoute(    "Product",     "Product/{productId:long=1000}",    new { controller = "Product", action = "Details" });

通用Routing

關于示例使用,我們先不從MVC開始,而是先從普通的Routing使用方式開始,新版route添加的時候默認添加的是TemplateRoute實例,并且在該實例實例化的時候要設置一個Handler。

舉例來說,我們先創建一個空的ASP.NET 5項目,并在project.json文件的dependencies節點中添加程序集"Microsoft.AspNet.Routing": "1.0.0-beta3",,在Startup.csConfigure方法里添加如下代碼:

public void Configure(IapplicationBuilder app){    RouteCollection routes = new RouteCollection();    routes.Add(new TemplateRoute(new DebuggerRouteHandler("RouteHandlerA"), "", null));    routes.Add(new TemplateRoute(new DebuggerRouteHandler("RouteHandlerB"), "test/{a}/{b:int}", null));    routes.Add(new TemplateRoute(new DebuggerRouteHandler("RouteHandlerC"), "test2", null));    app.UseRouter(routes); // 開啟Routing功能}

在這里,我們設置HTTP請求處理的的Handler為DebuggerRouteHandler,該類繼承于IRouter,實例代碼如下:

public class DebuggerRouteHandler : IRouter{    private string _name;    public DebuggerRouteHandler(string name)    {        _name = name;    }    public string GetVirtualPath(VirtualPathContext context)    {        throw new NotImplementedException();    }    public async Task RouteAsync(RouteContext context)    {        var routeValues = string.Join("", context.RouteData.Values);        var message = String.Format("{0} Values={1} ", _name, routeValues);        await context.HttpContext.Response.WriteAsync(message);        context.IsHandled = true;    }}

上述類,繼承IRouter以后,必須實現一個RouteAsync的方法,并且如果處理成功,則將IsHandled設置為true。

訪問如下網址即可查看相應的結果:

正常:`http://localhost:5000/`正常:`http://localhost:5000/test/yyy/12`404 :`http://localhost:5000/test/yyy/s`正常:`http://localhost:5000/test2`404 :`http://localhost:5000/test3`

注意:TemplateRouteDebuggerRouteHandler都繼承于IRouter,是實現前面所述的不出現404錯誤(繼續匹配下一個路由)的核心。

MVC中的Routing

在MVC示例程序中,我們只需要配置在調用app.UseMVC方法的時候,使用委托中的MapRoute方法來定義各種route就可以了。在這里我們以空白項目為例,來看看MVC的route如何使用。

第一步:在project.json文件的dependencies節點中引用程序集"Microsoft.AspNet.Mvc": "6.0.0-beta3",第二部:添加MVC的Middleware,并使用MVC,然后添加一條默認的路由,代碼如下:

public void ConfigureServices(IServiceCollection services){    services.AddMvc();}public void Configure(IApplicationBuilder app){    app.UseMvc(routeBuilder =>    {        routeBuilder.MapRoute(            name: "default",            template: "{controller}/{action}/{id?}",            defaults: new { controller = "Home", action = "Index" });    });}

第三步:分別創建如下如下三種

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美午夜精品在线| 国产日韩欧美影视| 久久99久久99精品中文字幕| 黑人巨大精品欧美一区二区| 在线观看中文字幕亚洲| 亚洲乱码国产乱码精品精天堂| 久久夜精品香蕉| 亚洲精品免费在线视频| 亚洲免费电影一区| 亚洲一区二区在线播放| 国产日本欧美一区二区三区在线| 日本不卡高字幕在线2019| 九九视频直播综合网| 欧美性生交xxxxxdddd| 日韩精品在线免费观看视频| 亚洲一区二区久久久久久久| 久久久中文字幕| 久久av.com| 国产香蕉精品视频一区二区三区| 欧美精品第一页在线播放| 精品偷拍各种wc美女嘘嘘| 91久久嫩草影院一区二区| 亚洲国产另类久久精品| www.日本久久久久com.| 成人在线免费观看视视频| 国产精品黄色影片导航在线观看| 日韩av在线网站| 久久中国妇女中文字幕| 亚洲欧美日韩直播| 亚洲日韩欧美视频一区| 久久久噜久噜久久综合| 国产精品69精品一区二区三区| 欧美大尺度激情区在线播放| 亚洲香蕉av在线一区二区三区| 狠狠躁18三区二区一区| 国产精品久久久久久网站| 精品爽片免费看久久| 亚洲a成v人在线观看| 精品国产欧美一区二区五十路| 国产91色在线|| 亚洲xxx视频| 亲子乱一区二区三区电影| 九九久久综合网站| 国产精自产拍久久久久久蜜| 国产精品第七十二页| 久久在线免费观看视频| 91久久在线观看| 久久精品国产久精国产思思| 亚洲欧美日韩在线高清直播| 91大神福利视频在线| 成人夜晚看av| 欧美性生交xxxxx久久久| 精品福利樱桃av导航| 欧美日韩性视频在线| 亚洲综合色av| 国内免费精品永久在线视频| 亚洲综合av影视| 国产不卡在线观看| 国产精品久久久久久久久男| 神马久久桃色视频| 黑丝美女久久久| 福利一区福利二区微拍刺激| 欧美另类暴力丝袜| 欧美色道久久88综合亚洲精品| 亚洲白拍色综合图区| 久久精品人人做人人爽| 国产精品久久97| 日韩精品极品视频免费观看| 精品久久久久久中文字幕一区奶水| 欧美高清自拍一区| 国产亚洲精品成人av久久ww| 中文字幕av一区中文字幕天堂| 91在线无精精品一区二区| 亚洲视频在线观看网站| 欧美电影免费观看高清| 国产一区二区三区免费视频| 久久在线视频在线| 亚洲一区www| 国产精品69av| 日韩激情在线视频| 97国产精品视频| 国产伊人精品在线| 日韩精品免费观看| 成人天堂噜噜噜| 久久人人爽人人爽爽久久| 日韩专区在线播放| 久久成人综合视频| 国产成人综合av| 久久久久久亚洲精品不卡| www.亚洲免费视频| 亚洲最大福利视频| 中文字幕在线观看日韩| 精品视频在线播放色网色视频| 午夜精品久久久久久久久久久久| 欧美日韩一区二区三区| 成人免费自拍视频| 国产精品久久久久久亚洲调教| 日韩av在线高清| 日韩高清电影免费观看完整版| 久久国内精品一国内精品| 日韩高清人体午夜| 欧美专区中文字幕| 日本19禁啪啪免费观看www| 另类天堂视频在线观看| 在线播放国产精品| 久久天堂电影网| 欧美乱大交xxxxx| 亚洲人成啪啪网站| 91精品国产91久久久久久| 国产精品欧美日韩一区二区| 日韩欧美一区二区在线| 91av网站在线播放| 91在线国产电影| 亚洲性视频网址| 日韩av电影在线网| 一区二区日韩精品| 国产精品视频区| 色偷偷9999www| 国产精品极品尤物在线观看| 欧美精品18videos性欧| 欧美色欧美亚洲高清在线视频| 国产成人免费91av在线| 欧美人成在线视频| 亚洲综合精品伊人久久| 精品av在线播放| 国产精品91在线| 欧美成人在线网站| 欧美又大粗又爽又黄大片视频| 成人免费看黄网站| 亚洲一区二区免费| 亚洲精品www| 亚洲天堂av在线免费观看| 成人免费观看a| 国产精品免费视频xxxx| 色中色综合影院手机版在线观看| 久久男人av资源网站| 日韩人体视频一二区| 91在线视频成人| 欧美人与物videos| 久久久久久久999| 黑人极品videos精品欧美裸| 在线播放日韩欧美| 日本老师69xxx| 久久久久中文字幕2018| 亚洲国产99精品国自产| 欧美高清视频在线观看| 57pao成人国产永久免费| xxav国产精品美女主播| 欧洲s码亚洲m码精品一区| 国产精品嫩草影院一区二区| 91精品国产综合久久久久久久久| 91精品国产综合久久香蕉922| 日韩精品在线视频| 在线精品91av| 亚洲老头老太hd| 国内免费精品永久在线视频| 亚洲伊人一本大道中文字幕| 国产一区二区三区日韩欧美| 欧美综合在线第二页| 亚州成人av在线| 国产精品视频播放| 亚洲欧美制服第一页| 欧美一级大片在线免费观看| 91高清视频免费|