国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Asp.net MVC5系列——Routing特性

網(wǎng)絡(luò) 路由交換
ASP.NET MVC 5支持一種新的路由協(xié)議,稱為路由特性。顧名思義,路由特性使用特性來定義路徑。

ASP.NET MVC 5支持一種新的路由協(xié)議,稱為路由特性。顧名思義,路由特性使用特性來定義路徑。路由特性使你的Web應(yīng)用程序URI有了更多的控制。當(dāng)然,MVC5也支持以前定義路由的方式,你可以在一個(gè)項(xiàng)目中混合使用這兩種方式來定義路由。

路由特性

例如,一個(gè)電子商務(wù)網(wǎng)站可能有以下的路由規(guī)則:

{productId:int}/{productTitle} 
Mapped to ProductsController.Show(int id)
{username} 
Mapped to ProfilesController.Show(string username)
{username}/catalogs/{catalogId:int}/{catalogTitle} 
Mapped to CatalogsController.Show(string username, int catalogId)

以往的ASP.NET MVC版本,該規(guī)則將設(shè)置在routeconfig.cs文件中,并指出實(shí)際控制器的Action方法,如:

  1. 1 routes.MapRoute( 
  2. 2     name: "ProductPage", 
  3. 3     url: "{productId}/{productTitle}", 
  4. 4     defaults: new { controller = "Products"action = "Show" }, 
  5. 5     constraints: new { productId = "\\d+" } 
  6. 6 ); 

當(dāng)路由的定義與Action方法,在同一個(gè)源文件中而不是在外部配置類中聲明,它可以更容易的處理URI和行動(dòng)之間的映射的。以前的路徑定義將使用以下,簡(jiǎn)單的特性就可以達(dá)到目的:

  1. [Route("{productId:int}/{productTitle}")] 
  2. public ActionResult Show(int productId) { ... } 

使用路由特性

首先得啟用Attribute路由,我們可以調(diào)用MapMvcAttributeRoutes方法來啟用Attribute路由:

  1. public class RouteConfig 
  2.  { 
  3.      public static void RegisterRoutes(RouteCollection routes) 
  4.     { 
  5.         routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
  6.    
  7.         routes.MapMvcAttributeRoutes(); 
  8.     } 
  9.  } 

也可以和常規(guī)的路由設(shè)置一起使用。

  1. public static void RegisterRoutes(RouteCollection routes) 
  2.    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
  3.  
  4.    routes.MapMvcAttributeRoutes(); 
  5.   
  6.    routes.MapRoute( 
  7.         name: "Default", 
  8.        url: "{controller}/{action}/{id}", 
  9.         defaults: new { controller = "Home"action = "Index"id = UrlParameter.Optional } 
  10.     ); 

可選URI參數(shù)和參數(shù)的默認(rèn)值

可以通過添加“?”標(biāo)記一個(gè)參數(shù)為可選的參數(shù),也可以為表單參數(shù)設(shè)置默認(rèn)值(參數(shù)=value)。

  1.  1 public class BooksController : Controller 
  2.  2 { 
  3.  3     // eg: /books 
  4.  4     // eg: /books/1430210079 
  5.  5     [Route("books/{isbn?}")] 
  6.  6     public ActionResult View(string isbn) 
  7.  7     { 
  8.  8         if (!String.IsNullOrEmpty(isbn)) 
  9.  9         { 
  10. 10             return View("OneBook", GetBook(isbn)); 
  11. 11         } 
  12. 12         return View("AllBooks", GetBooks()); 
  13. 13     } 
  14. 14   
  15. 15     // eg: /books/lang 
  16. 16     // eg: /books/lang/en 
  17. 17     // eg: /books/lang/he 
  18. 18     [Route("books/lang/{lang=en}")] 
  19. 19     public ActionResult ViewByLanguage(string lang) 
  20. 20     { 
  21. 21         return View("OneBook", GetBooksByLanguage(lang)); 
  22. 22     } 
  23. 23 } 

在上面的例子中,/books和/books/1430210079將路由到View方法,前者將返回所有書的列表信息,后者將返回特定的書的信息。/books/lang和/books/lang/en將采用同樣的方式。

路由前綴

在同一個(gè)控制器里面,路由以相同的前綴開始,例如:

  1. 1 public class ReviewsController : Controller 
  2.  2 { 
  3.  3     // eg: /reviews 
  4.  4     [Route("reviews")] 
  5.  5     public ActionResult Index() { ... } 
  6.  6     // eg: /reviews/5 
  7.  7     [Route("reviews/{reviewId}")] 
  8.  8     public ActionResult Show(int reviewId) { ... } 
  9.  9     // eg: /reviews/5/edit 
  10. 10     [Route("reviews/{reviewId}/edit")] 
  11. 11     public ActionResult Edit(int reviewId) { ... } 
  12. 12 } 

你可以通過使用[routeprefix ]特性整個(gè)控制器設(shè)定一個(gè)共同的前綴:

  1. 1 [RoutePrefix("reviews")] 
  2.  2 public class ReviewsController : Controller 
  3.  3 { 
  4.  4     // eg.: /reviews 
  5.  5     [Route] 
  6.  6     public ActionResult Index() { ... } 
  7.  7     // eg.: /reviews/5 
  8.  8     [Route("{reviewId}")] 
  9.  9     public ActionResult Show(int reviewId) { ... } 
  10. 10     // eg.: /reviews/5/edit 
  11. 11     [Route("{reviewId}/edit")] 
  12. 12     public ActionResult Edit(int reviewId) { ... } 
  13. 13 } 

如果需要定義不同的路由前綴,可以在方法特性上使用波浪號(hào)~覆蓋原來的前綴,例如:

  1. 1 [RoutePrefix("reviews")] 
  2. 2 public class ReviewsController : Controller 
  3. 3 { 
  4. 4     // eg.: /spotlight-review 
  5. 5     [Route("~/spotlight-review")] 
  6. 6     public ActionResult ShowSpotlight() { ... } 
  7. 7   
  8. 8     ... 
  9. 9 } 

#p#默認(rèn)路由

你也可以運(yùn)用在控制器級(jí)別的[路徑]特性,將Action方法作為一個(gè)參數(shù)。該路由將被應(yīng)用在控制器中的所有Action方法,除非Action方法使用了一個(gè)具體的[路由]特性,否則將使用控制器級(jí)別的默認(rèn)路由。

  1. 1 [RoutePrefix("promotions")] 
  2.  2 [Route("{action=index}")] 
  3.  3 public class ReviewsController : Controller 
  4.  4 { 
  5.  5     // eg.: /promotions 
  6.  6     public ActionResult Index() { ... } 
  7.  7   
  8.  8     // eg.: /promotions/archive 
  9.  9     public ActionResult Archive() { ... } 
  10. 10   
  11. 11     // eg.: /promotions/new 
  12. 12     public ActionResult New() { ... } 
  13. 13   
  14. 14     // eg.: /promotions/edit/5 
  15. 15     [Route("edit/{promoId:int}")] 
  16. 16     public ActionResult Edit(int promoId) { ... } 
  17. 17 } 

由上可知,Action方法的路由特性的優(yōu)先級(jí)大于控制器路由特性的優(yōu)先級(jí)。

路由約束

路由約束,使你限制路由模版中的參數(shù)是如何匹配的,一般的語法為{parameter:constraint},例如:

  1. 1 // eg: /users/5 
  2. 2 [Route("users/{id:int}"] 
  3. 3 public ActionResult GetUserById(int id) { ... } 
  4. 4   
  5. 5 // eg: users/ken 
  6. 6 [Route("users/{name}"] 
  7. 7 public ActionResult GetUserByName(string name) { ... } 

這里,如果id為int類型,將選擇***個(gè)路由,否則選擇第二個(gè)路由。

下表列出了支持的約束:

 

 

注意,其中一些帶min的約束,可以帶參數(shù)。

你也可以在一個(gè)參數(shù)上應(yīng)用多個(gè)約束,多個(gè)約束以分號(hào)";"分割,例如:

  1. 1 // eg: /users/5 
  2. 2 // but not /users/10000000000 because it is larger than int.MaxValue, 
  3. 3 // and not /users/0 because of the min(1) constraint. 
  4. 4 [Route("users/{id:int:min(1)}")] 
  5. 5 public ActionResult GetUserById(int id) { ... } 

通過問號(hào)"?"可以在內(nèi)聯(lián)約束中指定可選參數(shù),例如:

  1. 1 // eg: /greetings/bye 
  2. 2 // and /greetings because of the Optional modifier, 
  3. 3 // but not /greetings/see-you-tomorrow because of the maxlength(3) constraint. 
  4. 4 [Route("greetings/{message:maxlength(3)?}")] 
  5. 5 public ActionResult Greet(string message) { ... } 

自定義路由約束

可以通過實(shí)現(xiàn)接口IRouteConstraint 自定義路由約束,例如,定義一個(gè)參數(shù)有效性的約束:

  1.  1 public class ValuesConstraint : IRouteConstraint 
  2.  2 { 
  3.  3     private readonly string[] validOptions; 
  4.  4     public ValuesConstraint(string options) 
  5.  5     { 
  6.  6         validOptions = options.Split('|'); 
  7.  7     } 
  8.  8   
  9.  9     public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
  10. 10     { 
  11. 11         object value; 
  12. 12         if (values.TryGetValue(parameterName, out value) && value != null) 
  13. 13         { 
  14. 14             return validOptions.Contains(value.ToString(), StringComparer.OrdinalIgnoreCase); 
  15. 15         } 
  16. 16         return false; 
  17. 17     } 
  18. 18 } 

然后將自定義的約束進(jìn)行注冊(cè):

  1. 1 public class RouteConfig 
  2.  2 { 
  3.  3     public static void RegisterRoutes(RouteCollection routes) 
  4.  4     { 
  5.  5         routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
  6.  6   
  7.  7         var constraintsResolver = new DefaultInlineConstraintResolver(); 
  8.  8   
  9.  9         constraintsResolver.ConstraintMap.Add("values", typeof(ValuesConstraint)); 
  10. 10   
  11. 11         routes.MapMvcAttributeRoutes(constraintsResolver); 
  12. 12     } 
  13. 13 } 

#p#現(xiàn)在,你就可以在你的路由中使用該自定義的約束了

  1. 1 public class TemperatureController : Controller 
  2. 2 { 
  3. 3     // eg: temp/celsius and /temp/fahrenheit but not /temp/kelvin 
  4. 4     [Route("temp/{scale:values(celsius|fahrenheit)}")] 
  5. 5     public ActionResult Show(string scale) 
  6. 6     { 
  7. 7         return Content("scale is " + scale); 
  8. 8     } 
  9. 9 } 

路由名

你可以為一個(gè)路由指定一個(gè)名稱,以便生成相應(yīng)的url。例如:

  1. 1 [Route("menu", Name = "mainmenu")] 
  2. 2 public ActionResult MainMenu() { ... } 

你可以使用 Url.RouteUrl 來生成相應(yīng)的 URL

  1. <a href="@Url.RouteUrl("mainmenu")">Main menu</a> 

區(qū)域(Area)

你可以使用特性[RouteArea]指定一個(gè)控制器屬于某個(gè)區(qū)域,當(dāng)這樣做時(shí),你可以安全的移除該區(qū)域的AreaRegistration 類:

  1. 1 [RouteArea("Admin")] 
  2.  2 [RoutePrefix("menu")] 
  3.  3 [Route("{action}")] 
  4.  4 public class MenuController : Controller 
  5.  5 { 
  6.  6     // eg: /admin/menu/login 
  7.  7     public ActionResult Login() { ... } 
  8.  8   
  9.  9     // eg: /admin/menu/show-options 
  10. 10     [Route("show-options")] 
  11. 11     public ActionResult Options() { ... } 
  12. 12   
  13. 13     // eg: /stats 
  14. 14     [Route("~/stats")] 
  15. 15     public ActionResult Stats() { ... } 
  16. 16 } 

使用該控制器,下面的鏈接將產(chǎn)生下面的url:"/Admin/menu/show-options"

Url.Action("Options", "Menu", new { Area = "Admin" }) 

你也可以使用AreaPrefix參數(shù)建立一個(gè)自定義的區(qū)域前綴,例如:

[RouteArea("BackOffice", AreaPrefix = "back-office")]

如果你同時(shí)使用帶有路由特性的區(qū)域和帶有(AreaRegistration 類創(chuàng)建的)傳統(tǒng)路由的區(qū)域這兩種方式 的話,你應(yīng)該在配置MVC路由特性之后,默認(rèn)傳統(tǒng)路由之前注冊(cè)區(qū)域,原因很簡(jiǎn)單,路由注冊(cè)順序必須是從最精確的匹配規(guī)則開始再到普通的匹配規(guī)則,***才是模糊的匹配規(guī)則,這樣就避免了在進(jìn)行路由匹配時(shí),過早的匹配了模糊規(guī)則,而相對(duì)精確的匹配起不到任何作用。下面的例子展示了這一點(diǎn):

  1.  1 public static void RegisterRoutes(RouteCollection routes) 
  2.  2 { 
  3.  3     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
  4.  4   
  5.  5     routes.MapMvcAttributeRoutes(); 
  6.  6   
  7.  7     AreaRegistration.RegisterAllAreas(); 
  8.  8   
  9.  9     routes.MapRoute( 
  10. 10         name: "Default", 
  11. 11         url: "{controller}/{action}/{id}", 
  12. 12         defaults: new { controller = "Home"action = "Index"id = UrlParameter.Optional } 
  13. 13     ); 
  14. 14 } 

 

本文主要學(xué)習(xí)了asp.net mvc5路由的新特性,在查看mvc5的資料的時(shí)候,看到的一篇文章,覺得不錯(cuò),就認(rèn)真的看了一遍,試著用自己的語言翻譯了原文,也許有翻譯不到位的地方,望諒解。

 

責(zé)任編輯:林琳 來源: 博客園
相關(guān)推薦

2015-06-18 14:13:36

ASP.NET

2009-03-12 10:42:38

RoutingIgnoreRouteASP.NET

2009-08-19 09:23:40

ASP.NET Rou

2015-06-18 17:37:19

ASP.NET

2009-07-21 15:11:14

ASP.NET Rou

2015-06-18 16:29:14

ASP.NET

2010-10-12 09:52:02

ASP.NET MVC

2011-01-15 23:07:59

2009-07-31 12:43:59

ASP.NET MVC

2015-06-18 16:39:17

ASP.NET

2015-06-18 17:04:22

ASP.NET

2015-06-17 14:42:04

ASP.NET

2009-07-24 13:20:44

MVC框架ASP.NET

2015-06-17 16:45:28

ASP.NET

2015-06-16 15:01:59

ASP.NET 5

2015-06-17 16:01:30

ASP.NET

2010-12-07 09:38:15

ASP.NET MVC

2009-07-20 16:44:56

ASP.NET MVCIValueProvi

2010-02-03 09:50:58

ASP.NET MVC

2015-06-18 14:25:56

ASP.NET
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲风情在线资源| 欧洲精品一区二区三区久久| 欧美日韩高清区| 7777精品伊久久久大香线蕉语言| 欧美日韩激情小视频| 奇米综合一区二区三区精品视频| 欧美高清影院| 黄色录像1级片| 国产精品一区二区你懂得| ijzzijzzij亚洲大全| 色悠悠久久综合| 五月开心婷婷久久| 精品久久久久久久久久国产| 亚洲一线二线三线视频| 欧美男同性恋视频网站| 亚洲午夜久久久久久久| 久久精品视频中文字幕| 国产精品扒开腿做爽爽爽男男| 国产九区一区在线| 国产成人永久免费视频| 久热精品在线观看视频| 婷婷在线视频观看| aaaa欧美| 9191国语精品高清在线| 久久久久一区二区三区四区| 五月综合激情网| 欧美丰满嫩嫩电影| 成人欧美一区二区三区黑人麻豆 | 欧美日本韩国国产| 91视频九色网站| 欧美激情在线一区| 99久久99| 欧美少妇一级片| 97干com| 黄在线观看免费网站ktv| 好吊妞视频这里有精品| 久久久国产精品一区二区中文| 国产亚洲欧美中文| 欧美一级夜夜爽| 韩国福利视频一区| 一区二区三区国| 久久手机免费观看| 成人做爰视频www网站小优视频| 婷婷丁香综合| 96av麻豆蜜桃一区二区| 欧美午夜精品久久久久久浪潮| 日韩在线观看av| 亚洲人成网站在线观看播放| 性史性dvd影片农村毛片| ww久久综合久中文字幕| 麻豆成人免费电影| 欧美一区二区在线观看| 成人激情视频在线播放| 色视频网站在线| 久久久久黄色| 欧美日韩国产免费观看 | 日韩免费精品视频| 免费在线观看污污视频| 久久久久久久| 91精品91| 欧美精品一区二区久久久| 国产精品国产三级国产专区51| 爱情电影社保片一区| 国产视频一区二区在线观看| 成人黄色av网| 操喷在线视频| 亚洲综合免费观看高清在线观看| 蜜桃成人在线| 蜜乳av综合| 欧美成人猛片aaaaaaa| 能在线观看的av| 精品999日本| 一区二区三欧美| 亚洲一区二区三区成人| 久久99精品久久久久久园产越南| 欧美日韩在线播放一区| 欧美精品在欧美一区二区| 国产99精品| 亚洲级视频在线观看免费1级| 男人添女人下面免费视频| 日韩综合小视频| 午夜精品国产精品大乳美女| 成人免费高清| 亚洲色图一区二区三区| 色狠狠久久av五月综合| 欧洲专线二区三区| 亚洲日韩中文字幕| 精品成人一区二区三区免费视频| 久久99热国产| 91pron在线| 欧美精品momsxxx| 色综合老司机第九色激情 | 成人亚洲精品久久久久软件| 久久久人人爽| 91三级在线| 亚洲欧美综合久久久| 精品中文字幕久久久久久| 日韩欧美国产片| 亚洲精品日韩久久| 欧美精品在线免费| 天堂av中文在线| 国产女人18水真多18精品一级做 | 国产伦乱精品| 国内外成人在线视频| h网址在线观看| 免费电影一区二区三区| 国产精品对白交换视频| 国产成人精品一区二区在线| jizz在亚洲| 色综合狠狠操| 欧美一区二区三区四区视频| 日韩不卡一二区| 一区二区三区日本视频| 国产精品视频第一区| 国产区一区二区三区| 免费h在线看| 中文字幕日韩av资源站| 97免费资源站| 黑人另类精品××××性爽| 欧美国产日韩在线观看| 国精产品一区二区| 欧美日韩伦理一区二区| 日韩av综合网站| 午夜激情影院| 国内精品久久久久影院色| 这里只有精品丝袜| 欧美重口乱码一区二区| 桃子视频成人app| 天天色天天操综合| 免费一级特黄毛片| 91精品国产福利在线观看麻豆| 欧美一区二区三区电影| 国产福利成人在线| 3d动漫成人在线| 亚洲免费影院| 国产91色在线|| 国产精品美女久久久久人| 欧美xxxx老人做受| 一本大道香蕉久久| 国产一区二区三区国产| 好看的日韩精品| 欧美大黑bbbbbbbbb在线| 久久久亚洲国产| 亚洲ww精品| 久久精品亚洲精品| 日韩美女在线看免费观看| 亚洲国产天堂久久综合网| 生活片a∨在线观看| 欧美日韩一区二区欧美激情 | 春暖花开成人亚洲区| 好吊成人免视频| 国产午夜在线观看| 69p69国产精品| 美女网站视频在线| 亚洲国产成人爱av在线播放| 免费一区二区视频| 欧美激情免费看| 人人超在线公开视频| 一区二区三区四区高清精品免费观看| 91视视频在线直接观看在线看网页在线看| 九九热r在线视频精品| 99re6热在线精品视频播放| 丁香五精品蜜臀久久久久99网站| 日本成人黄色片| 性开放的欧美大片| 亚洲视频狠狠干| 奇米精品一区二区三区| 日韩久久视频| 在线电影av不卡网址| 素人av在线| 麻豆av在线| 欧日韩免费视频| 久99久精品视频免费观看| 国产精品一区二区三区久久久| 亚洲成精国产精品女| 丝袜美腿一区| 亚洲精品一区二区三区影院 | 成人精品视频在线| 欧美三级网址| 国产丝袜一区二区三区免费视频| 欧美国产乱子伦| 免费yellow网站| 成人av一区二区三区| 国产精品99久久久久久动医院| 欧美一区二区三区免费观看| 国产一区二区三区朝在线观看| 欧美变态另类刺激| 欧美激情资源网| 99热在线观看| 精品久久久久久久大神国产| 亚洲国产福利在线| 亚洲一级特黄| 精品久久sese| 懂色av一区二区在线播放| 国产欧美日韩综合一区在线播放| 成人黄色大片在线免费观看| 精品亚洲自拍| 久久香蕉精品香蕉| 国产美女性感在线观看懂色av| 欧美日韩免费在线|