日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET MVC Routing、Areas、URLs

發布時間:2025/4/14 asp.net 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET MVC Routing、Areas、URLs 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

webForm頁面運行起來url一般是這樣的:localhost:****/index.aspx,這個過程就是當你運行頁面的時候,vs開發工具自帶的微型服務器會打開你存在硬盤上的這個文件然后顯示在瀏覽器上,所以url是后半部分是頁面的名字(index.aspx),但是在mvc中卻是這樣的:localhost:****/index,因為mvc中有一整套路由機制來控制瀏覽器的請求。

看看Global.asax文件里路由的定義:

public static void RegisterRoutes(RouteCollection routes) {routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute("Default", // 路由名稱"{controller}/{action}/{id}", // 帶有參數的 URLnew { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數默認值 ); }

注釋掉這個默認的路由,自己重新定義一個路由:

根據vs的只能提示可以看出參數一個是路由名稱,一個是路由的模式,定義為這樣:

routes.MapRoute("MyRoute", "{controller}/{action}");

有了路由了就可以去創建控制器了,新建一個HomeController:

public class HomeController : Controller {public ActionResult Index(){return View();} }

再去創建一個對應的View:

@{Layout = null; } <!DOCTYPE html> <html> <head><title>Index</title> </head> <body><div>HomeController下的Index Action響應的同名視圖Index</div> </body> </html>

直接運行程序發現報404錯誤,找不到頁面。查看下路由就知道了問題:這個路由指定的是url模式是{controller}/{action}的方式,而瀏覽器里的url卻是localhost:****,既沒有寫Controller,也沒有寫Action,顯然不符合路由的定義,自然得報404錯了。把Url補充完整就可以找到頁面了:localhost:****/home/index,當然如果在url后面少一級或者多加一級都會報404錯:localhost:****/home、localhost:****/home/index/1,可見Url必須嚴格根據路由的定義來。
當然,也可以在路由定義的時候就給默認值:

routes.MapRoute("MyRoute", "{controller}/{action}", new { controller = "Home", action = "Index" });

這樣運行程序就不報錯了:localhost:****,根據路由給的默認值就相當于:localhost:****/home/index

再看這兩條路由的定義:

routes.MapRoute("", "Customers/{controller}/{action}"); routes.MapRoute("", "X{controller}/{action}");

第一條路由對應的Url是這樣的:localhost:****/Customers/Home/Index
第二條是:localhost:****/XHome/Index
區別:第一條是靜態的路由,第一級目錄必須是路由里指定了的Customers,而第二條路由則是動態可變的,第一級只要以X開頭都可以和本路由匹配上

路由的順序:
如果同時定義了這么兩條路由:

routes.MapRoute("MyRoute", "{controller}/{action}"); routes.MapRoute("", "X{controller}/{action}");

現在瀏覽器有這么條Url請求過來了:localhost:****/XHome/Index 看到XHome好像得使第二條路由了,但是不是。這條Url同時符合兩條路由就優先使用前面的路由。根據第一條路由,這條Url過去就是找XHome這個控制器Controller里的Index Action

混合的靜態路由,帶默認值:

routes.MapRoute("ShopSchema", "Shop/{action}", new { controller = "Home" });

這條名為ShopSchema的路由沒有定義Controller,而是給了一個默認值Home,但是如果直接請求localhost:****/home/index 雖然有HomeController,但是還是會報404,因為路由已經限制了Controller部分必須是Shop,所以url得是這樣:localhost:****/shop/index,雖然沒有ShopController,但是同樣會導向到HomeController下。
注:為了演示路由效果,防止前面定義的路由影響到Url請求的控制器,所以得先把之前的所有路由都注釋了再運行查看效果。

routes.MapRoute("ShopSchema2", "Shop/OldAction", new { controller = "Home", action = "Index" });

Url:localhost:1042/shop/OldAction 找的同樣是HomeController下的Index這個Action

定義額外的參數:
路由當然不光可以定義controller和action,同時也可以定義之后的參數,比如:

routes.MapRoute("MyRoute", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "10086" });

在控制器下可以這么拿到傳進來的id參數:ViewBag.CustomVariable = RouteData.Values["id"];
視圖View中這么調用:@ViewBag.CustomVariable

{controller}/{action}/{id} 對應的url是這樣的:localhost:****/home/index/10010? 視圖中輸出:10010

當然,因為路由給了默認值,所有一下url都可以:
localhost:****
localhost:****/home
localhost:****/home/index? 輸出的都是:10086

可選參數:

routes.MapRoute("MyRoute", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });

Optional這個在EF配置實體之間的一對一、一對多等關系里演示過,表示可選的意思,這里的路由也是一樣,表示id部分就是可選的:
localhost:**** =>? controller = Home? action = Index
localhost:****/Customer? =>? controller = Home? action = Index
localhost:****/Customer/List? =>? controller = Home? action = Index
localhost:****/Customer/List/All? =>? controller = Home? action = Index? id = All

可變長度的路由:

routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });

localhost:**** =>? controller = Home? action = Index
localhost:****/Customer? =>? controller = Home? action = Index
localhost:****/Customer/List? =>? controller = Home? action = Index
localhost:****/Customer/List/All? =>? controller = Home? action = Index? id = All
localhost:****/Customer/List/All/Delete? =>? controller = Home? action = Index? id = All? catchall = Delete
localhost:****/Customer/List/All/Delete/Perm? =>? controller = Home? action = Index? id = All? catchall = Delete/Perm

指定命名空間:

routes.MapRoute("MyRoute", "{controller}/{action}", new { controller = "Home", action = "Index" });

這是一個極普通的路由,項目運行起來,默認找的是HomeController下的Index這個Action,但是現在如果項目下同個命名空間有兩個HomeController怎么辦,那自然要報錯的:


可以指定命名空間:

routes.MapRoute("MyRoute", "{controller}/{action}", new { controller = "Home", action = "Index" }, new[] { "RouteDemo4Blog.Controllers" });

正則表達式路由:

routes.MapRoute("MyRoute", "{controller}/{action}", new { controller = "Home", action = "Index" }, new { controller = "^H.*" });

可適配所有以字母H開頭的Controller 再來一個:

routes.MapRoute("MyRoute", "{controller}/{action}", new { controller = "Home", action = "Index" }, new { controller = "^H.*", action = "^Index$|^About$" });

元字符^和$分別匹配字符串的開始和結束 | 表示或,所有這個路由匹配名為Index或者About的Action

指定url請求方式:

routes.MapRoute("MyRoute", "{controller}/{action}", new { controller = "Home", action = "Index" }, new { controller = "^H.*", action = "Index|About", httpMethod = new HttpMethodConstraint("GET") });

只響應GET請求(默認)

傳遞額外的值:

@Html.ActionLink("About this application", "About", new { id = "MyID" })

生成的HTML就是:

<a href="/Home/About/MyID">About this application</a>

點擊頁面上這個a標簽自然區找的就是對應的路由了。

@Html.ActionLink("Click me", "List", "Catalog", new {page=789}, null)

生成的HTML:

<a href="/Catalog/List/Purple/789">Click me</a>

對應的路由自然就是這樣的:

routes.MapRoute("MyRoute", "{controller}/{action}/{color}/{page}");

指定css:

@Html.ActionLink("About this application", "Index", "Home", null, new {id = "myAnchorID", @class = "myCSSClass"}) <a class="myCSSClass" href="/" id="myAnchorID">About this application</a>

?

生成完整的url:
之前生成的都是相對路徑的Url,現在看看絕對路徑的:

@Html.ActionLink("About this application", "Index", "Home", "https", "myserver.mydomain.com", " myFragmentName", new { id = "MyId"}, new { id = "myAnchorID", @class = "myCSSClass"})

生成的HTML:

<a class="myCSSClass" href="https://myserver.mydomain.com/Home/Index/MyId#myFragmentName" id="myAnchorID">About this application</a>

生成Url:
之前的@Html.ActionLink方法生成的都是a標簽,看看如何生成url:

@Url.Action("Index", "Home", new { id = "MyId" }) /Home/Index/MyId


Areas

Areas官方的解釋是為了劃分功能使用的,比如區分:管理員、訂單、客戶等功能,適合大項目使用,同時方便程序員之間協同開發。來一個試試:右鍵解決方案 - 添加 - 區域 - Admin - 確定

可以看出每個區域Areas里都是個mini的MVC項目,Controller、Models、Views一個都不缺,還多了一個AdminAreaRegistration類,看看其中的代碼:

public class AdminAreaRegistration : AreaRegistration {public override string AreaName{get{return "Admin";}}public override void RegisterArea(AreaRegistrationContext context){context.MapRoute("Admin_default","Admin/{controller}/{action}/{id}",new { action = "Index", id = UrlParameter.Optional });} }

可以看出其中已經有一個默認的路由了,跟普通的MVC項目是一樣的,只不過前面多了一個Admin。向這個Areas里添加一個Controller試試:右鍵Controllers目錄 - 添加 - 控制器 - HomeController 同時添加對應的視圖Index:

@{ViewBag.Title = "Index"; } <h2>Admin Area Index</h2>

運行下程序,url定位到:localhost:1042/admin/home/index就能顯示這個視圖了。但是如果直接請求localhost:1042會報錯:

很明顯是因為默認的路由和Areas下的路由沖突了,這個之前演示過。解決方法就是加上命名空間:'

routes.MapRoute("Default", // 路由名稱"{controller}/{action}/{id}", // 帶有參數的 URLnew { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 參數默認值new[] { "RouteDemo4Blog.Controllers" });

當然也可以從一個Areas跳轉到另一個Areas:

@Html.ActionLink("跳轉到別的Areas", "Index", new { area = "Support" })

生成的HTML:

<a href="/Support/Home">跳轉到別的Areas</a>

跳轉到頂級Controller:

@Html.ActionLink("Click me to go to another area", "Index", new { area = "" })

?

本文源碼

系列文章導航

轉載于:https://www.cnblogs.com/oppoic/p/mvc_urls_route_routing_areas.html

總結

以上是生活随笔為你收集整理的ASP.NET MVC Routing、Areas、URLs的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲精品88 | 人妻在线一区二区三区 | 伊人网成人网 | 好看的毛片 | 在线视频一区二区三区 | 久久久久亚洲国产 | 久久99精品久久久久婷婷 | 在线午夜av| 欧美乱欲视频 | 少妇久久精品 | 丰满熟妇人妻av无码区 | 神马国产 | 日韩av综合网 | 国产suv精品一区二区6 | 欧美另类videosbestsex日本 | 视频一区二区三区四区五区 | 男女做的视频 | 国产精品老熟女一区二区 | 1769国产 | 影音先锋二区 | 婷婷精品| 伊人亚洲综合 | 调教撅屁股啪调教打臀缝av | 在线观看国产福利 | 国产在线精品成人欧美 | 国内精品免费视频 | 尤物在线精品 | 国产777| 麻豆av免费在线 | 丝袜美腿亚洲综合 | 成人黄色免费网址 | 午夜看片在线观看 | 成人精品一区二区三区在线 | 精品人妻一区二区三区蜜桃 | 奇米四色在线视频 | 黄色一级视频免费观看 | 野外(巨肉高h) | 久久午夜夜伦鲁鲁一区二区 | 亚洲 国产 欧美 日韩 | 一区二区三区欧美日韩 | 精品国产一区二区三区av性色 | 先锋成人| 五月天激情社区 | 狠狠人妻久久久久久综合 | 亚洲精品成人无码熟妇在线 | 色站av | 国产精品无码在线 | 男人舔女人下部高潮全视频 | 欧美日韩亚洲激情 | 天天插视频 | 亚洲美女性视频 | 欧美精品一区二区在线观看 | 免费看v片| 午夜黄视频 | 91亚洲国产成人久久精品网站 | 国产一区二区三区在线播放无 | www.日日夜夜 | 人妻aⅴ无码一区二区三区 阿v免费视频 | 欧洲做受高潮欧美裸体艺术 | 午夜精品久久久久久久久久久久久蜜桃 | 亚洲在线成人 | 激情视频在线观看免费 | 亚洲一区a | 天天摸天天操 | 亚洲国产精品视频一区 | 97人妻精品一区二区 | 国产精品国产精品 | www国产亚洲精品久久网站 | 美丽的姑娘观看在线播放 | 又黄又色又爽 | 先锋影音av资源站 | 国产精品美女网站 | 少妇激情一区二区三区 | 国产精品偷拍 | 一区视频 | 五月婷婷六月激情 | 欧美一级大片 | 国产激情视频一区二区 | 欧美一区二区三区色 | 欧美日韩色综合 | 欧美人与性动交α欧美精品 | 中国一级免费毛片 | 北条麻妃久久 | 欧美人与性动交α欧美片 | 岛国免费视频 | 成人有色视频 | 亚洲色图13p | 欧美一级爱爱 | 999在线视频 | 粉嫩小箩莉奶水四溅在线观看 | 午夜视频网 | 日韩毛片免费观看 | av亚洲在线观看 | 日本裸体网站 | 国产成人在线影院 | 第四色男人天堂 | 日韩乱码人妻无码系列中文字幕 | 天天色综合av | 亚洲一区 在线播放 |