上一主題下一主題
«12345»Pages: 1/10     Go
關鍵字
主題 : 實例快速上手 - ASP.NET MVC4中的Area使用場景與注意事項
級別: VIP四級

UID: 230365
精華: 12
發帖: 314
威望: 3432 點
學點: 380 點
貢獻: 2 點
好評: 1 點
學幣: 0 個
注冊時間: 2010-04-16
最后登錄: 2014-09-25
樓主  發表于: 2014-07-23 16:49||

1 實例快速上手 - ASP.NET MVC4中的Area使用場景與注意事項

管理提醒: 本帖被 beifengfwy 執行加亮操作(2014-07-23)
_^'fp  
Cd.pMoS  
,qak_bP  
l t r =_  
目錄 wh:O"&qk  
SI3ek9|XU  
前言 k IV/o  
創建Area \Nu(+G?e  
Area的運行 EVMhc"L  
Controller的歧義問題 `,4"[6S  
生成Area URL鏈接 34 W#  
 B&#TbKp  
內容 vbmSbZ"y  
v8,+|+3  
前言 X~Uvh8O  
WEUr;f  
ASP.NET MVC允許使用 Area(區域)來組織Web應用程序,每個Area代表應用程序的不同功能模塊。這對于大的工程非常有用,Area 使每個功能模塊都有各自的文件夾,文件夾中有自己的Controller、View和Model,但對于管理也增加了一定的難度。 8zGe5Dn9  
創建Area k/O|ia 6  
右鍵工程選擇 添加->區域,彈出如下填寫Area的對話框: to^ &:  
za'Eom-<u  
點擊添加后,工程目錄結構如下: dC_L~ }=  
=L9sb!  
和創建一個空MVC工程結構類似,Admin Area 有自己的 Controllers、Models 和 Views 文件夾,不一樣的地方就是多了一個 AdminAreaRegistration.cs 文件,這個文件中定義了一個叫 AdminAreaRegistration 的類,它的內容如下: @D-l_[  
namespace MvcApplication1.Areas.Admin { 0]{h,W3]@[  
    public class AdminAreaRegistration : AreaRegistration { ;14[)t$  
        public override string AreaName { XRKL;|cd  
            get { |uQJMf[L)  
                return "Admin"; i Cao;Zb  
            } XQ- -8G  
        } KP[ax2!x  
"8J$7g@n@  
        public override void RegisterArea(AreaRegistrationContext context) { tS8*l2Y`   
            context.MapRoute( CTbdY,=B  
                "Admin_default", R{5Qb?&wOp  
                "Admin/{controller}/{action}/{id}", fzRzkn:=  
                new { action = "Index", id = UrlParameter.Optional } Z&@X4X"q  
            ); Y.3]vno?X  
        } aG8}R~wH&  
    } iDlIx8PI  
} ]nhLv!Co  
系統自動生成的 AdminAreaRegistration 類繼承至抽象類 AreaRegistration,并重寫了 AreaName 屬性和 RegisterArea 方法。在 RegisterArea 方法中它為我們定義了一個默認路由,我們也可在這個方法中定義專屬于Admin Area的的其他路由。但有一點要注意,在這如果要給路由起名字,一定要確保它和整個應用程序不一樣。 U5z^R>k  
AreaRegistrationContext 類的 MapRoute 方法和 RouteCollection 類的 MapRoute 方法的使用是一樣的,只是 AreaRegistrationContext 類限制了****的路由只會去匹配當前 Area 的 controller,所以,如果你把在 Area 中添加的 controller 的默認命名空間改了,路由系統將找不到這個controller 。 $[}31=0  
RegisterArea 方法不需要我們手動去調用,在 Global.asax 中的 Application_Start 方法已經有下面這樣一句代碼為我們****好了這件事: [#kfl  
EQ8jxr<p  
調用 AreaRegistration.RegisterAllAreas 方法讓MVC應用程序在啟動后會尋找所有繼承自 AreaRegistration 的類,并為每個這樣的類調用它們的 RegisterArea 方法。 YQ g03i  
注意:不要輕易改變 Application_Start 中****方法的順序,如果你把RouteConfig.RegisterRoutes方法放到AreaRegistration.RegisterAllAreas方法之前,Area 路由的****將會在路由****之后,路由系統是按順序來匹配的,所以這樣****會讓請求 Area 的 Controller 匹配到錯誤的路由。 uO>$ ,s  
Area的運行 R{\vOw:*  
在Area中添加controller、view和model和一般的添加是一樣的。在這,我們在Admin Area中添加一個名為 Home 的controller,代碼如下: aJ88U69  
public class HomeController : Controller { =|bM|8,  
         9kuL1tcY  
    public ActionResult Index() { 5Az=)q4Q  
        return View(); 4~hd{8  
    } kB_GL>fc  
} 49^;T;'v  
然后我們再為Index Acton添加一個View,代碼如下: k'&BAC。K,  
@{ o*eU0   
    ViewBag.Title = "Index"; _W/s=pCh  
    Layout = null; Yvs)H'n=  
} kih;'>H<  
<!DOCTYPE html> _N$3c<dY'  
6E{HNP Mb>  
<html> >B U 0B  
<head> ++-HdSHY  
    <meta name="viewport" content="width=device-width" /> $FZ~]Ef  
    <title>Index</title> HhhN8t  
</head> OGh9^,v  
<body> jxL} tS{j  
    <div> !fZ\GOx  
        <h2>Admin Area Index</h2> O;9u1,%w  
    </div> )~v`dwKj;  
</body> GL_YT.(!  
</html> 8s-y+M@.  
運行應用程序,然后將URL定位到/Admin/Home/Index,下面是運行結果: d }=fJ  
6x)7=_:0  
到這,我們已經看到,Area中的的工作流程其實就是和根目錄下的流程是一樣的。但Area并不是一個完全獨立的工作空間,我們下面來看看。 ?>cx; "xF  
Controller的歧義問題 vP`Sz}FU  
試想一下,如果我們現在在根目錄的 Controller 文件夾中也添加一個名為 Home 的 Controller,然后我們通過把URL定位到 /Home/Index,路由系統能匹配到根目錄下的 Controller 嗎? %B}Q.'  
在根目錄的 Controllers 文件夾中添加好 HomeController 后,為Index添加View,內容隨意: x :\+{-  
<body> u\ro9l  
    <div> 7"@^JxYN  
        <h2>Root Index</h2> +%7v#CY &  
    </div> LQ`s>q  
</body> K#_&}C^-jY  
路由不改動,我們使用 RouteConfig.cs 文件中系統定義的默認路由: $wg5q\Rv  
public static void RegisterRoutes(RouteCollection routes) { K'%2'd  
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); xHq"1Vs=  
F kY}6  
    routes.MapRoute( NY 756B*  
        name: "Default", |tIr?nXSW3  
        url: "{controller}/{action}/{id}", $nF|n+m  
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } `ltc)$  
    ); \(2w /~  
} 7/+I"~  
運行程序,將URL定位到 /Home/Index。結果我們會看到如下錯誤信息: N;4bEcWjp  
7rQwn2XD{  
出現這個問題是因為路由系統進行匹配的時候出現了Controller同名的歧義。 n75)%-  
當Area被****的時候,Area中定義的路由被限制了只尋找 Area 中的Controller,所以我們請求 /Admin/Home/Index 時能正常得到 MvcApplication1.Areas.Admin.Controllers 命名空間的 HomeController。然而我們在RouteConfig.cs文件的RegisterRoutes方法中定義的路由并沒有類似的限制。 /4/'&tY  
為了解決這個問題,我們需要在RouteConfig.cs文件中定義的路由中加上對應的 namespaces 參數。RouteConfig.cs 中修改后的路由如下: :dq.@:+<R  
VK*Dm:G0  
運行程序,如下結果說明解決了同名歧義問題: LvtHWt  
v e($l"T  
添加了 namespaces 參數后,路由系統在對這個路由進行匹配時,優先匹配指定命名空間的controller,如果匹配到則即刻停止查找,如果在指定的命名空間下沒有匹配到對應的controller,再按照一般的方式進行匹配。 :B{Wf 2<z  
NIgqdEu1  
生成Area URL鏈接 VzfaUAIZl  
關于Area的URL鏈接生成,可以分為這么三種情況:第一種是在當前Area生成指向當前Area的鏈接;第二種是生成指向其他Area的鏈接;第三種是在某個Area中生成指向根目錄的鏈接。下面是這三種情況生成鏈接的方法,使用的路由定義是系統默認的。 * N>n5B2  
如果要在Area中生成當前Area的URL鏈接,直接用下面的方法就行: Lh%z2 5t  
@Html.ActionLink("Click me", "About") <}75Xo  
它根據當前所在的Area和Controller會生成如下Html代碼: 2[~|#0x  
<a href="/Admin/Home/About">Click me</a> 9<n2-l|)  
如果要生成其他Area的URL鏈接,則需要在Html.ActionLink方法的匿名參數中使用一個名為area的變量來指定要生成鏈接的Area名稱,如下: m}A|W[p<  
@Html.ActionLink("Click me to go to another area", "Index", new { area = "Support" }) g)$/'RB  
它會根據被指定的Area去找路由的定義,假定在Support Area中定義了對應的路由,那么它會生成如下鏈接: ,]`|2j  
<a href="/Support/Home/Index">Click me to go to another area</a> J,4,#2M8  
如果要在當前Area生成指根目錄某個controller的鏈接,那么只要把area變量置成空字符串就行,如下: m%zo? e  
@Html.ActionLink("Click me to go to top-level part", "Index", new { area = "" }) 5~D(jHY;  
它會生成如下Html鏈接: A0hKzj  
<a href="/Home/Index">Click me to go to top-level part</a> ! Gob `# r  
Vu.VH([b]Q  
注:此課程系 我本人的大型商業課程《基于ASP.NET MVC 4 +Knockout.JS+Web API+FluentData+EasyUI 技術實現Web通用商業****發框架》中 項目預備知識部分的 i>z_6Gax*[  
課程四《ASP.NET MV**** 核心技術教程》中的《專題三、實例快速上手 - ASP.NET MV**** URL Routing 深入與使用URL最佳實踐》 Q^\m@7O :  
整套課程預計7月份內上線預****,敬請關注北風官網! riR(CJ}Ff  
6/Iq@BZ&  
鏈接: <fHJ9(5$V  
密碼:
本部分內容設定了隱藏,需要回復后才能看到
nQGl]2  
nTsKJX%\  
'0-YFx'U0V  
nuKcq!L  
級別: VIP四級

UID: 332925
精華: 0
發帖: 4
威望: 22 點
學點: 8 點
貢獻: 0 點
好評: 0 點
學幣: 0 個
注冊時間: 2011-12-08
最后登錄: 2016-05-21
沙發(1樓)  發表于: 2014-08-12 12:31||

回 樓主(beifengfwy) 的帖子

頂起來
級別: 北風愛好者

UID: 468905
精華: 0
發帖: 6
威望: 9 點
學點: 14 點
貢獻: 0 點
好評: 0 點
學幣: 0 個
注冊時間: 2014-06-15
最后登錄: 2014-11-19
板凳(2樓)  發表于: 2014-09-10 15:03||

回 樓主(beifengfwy) 的帖子

<h1>謝謝樓主<h1>
級別: 北風愛好者

UID: 468905
精華: 0
發帖: 6
威望: 9 點
學點: 14 點
貢獻: 0 點
好評: 0 點
學幣: 0 個
注冊時間: 2014-06-15
最后登錄: 2014-11-19
地板(3樓)  發表于: 2014-09-10 15:03||

<h1>謝謝樓主</h1>
級別: 北風工程師

UID: 470673
精華: 0
發帖: 3
威望: 2297 點
學點: 2316 點
貢獻: 251 點
好評: 0 點
學幣: 19 個
注冊時間: 2014-06-29
最后登錄: 2015-06-06
地下室(4樓)  發表于: 2014-09-13 10:00||

好樣的
級別: 北風助理工程師

UID: 283464
精華: 0
發帖: 37
威望: 317 點
學點: 36 點
貢獻: 0 點
好評: 0 點
學幣: 0 個
注冊時間: 2011-01-27
最后登錄: 2014-11-04
下水道(5樓)  發表于: 2014-09-16 15:39||

回 樓主(beifengfwy) 的帖子

看看,學習一下。
級別: VIP五級

UID: 432077
精華: 0
發帖: 8
威望: 64 點
學點: 10 點
貢獻: 1 點
好評: 0 點
學幣: 0 個
注冊時間: 2013-07-26
最后登錄: 2016-09-12
6樓  發表于: 2014-09-21 09:05||

應該有學習價值的參考資料
級別: 北風愛好者

UID: 503654
精華: 0
發帖: 2
威望: 5 點
學點: 0 點
貢獻: 0 點
好評: 0 點
學幣: 0 個
注冊時間: 2014-09-25
最后登錄: 2014-09-25
7樓  發表于: 2014-09-25 00:05||

真是無私啊
級別: 北風愛好者

UID: 504775
精華: 0
發帖: 1
威望: 1 點
學點: 3 點
貢獻: 0 點
好評: 0 點
學幣: 0 個
注冊時間: 2014-09-27
最后登錄: 2014-09-27
8樓  發表于: 2014-09-27 16:45||

覺得肯定有幫助
級別: VIP四級

UID: 389966
精華: 0
發帖: 13
威望: 103 點
學點: 21 點
貢獻: 0 點
好評: 0 點
學幣: 0 個
注冊時間: 2012-10-23
最后登錄: 2016-11-17
9樓  發表于: 2014-10-10 09:34||

謝謝分享!!
上一主題下一主題
«12345»Pages: 1/10     Go
极速快三 天津11选5 2019挂机国内网赚软件 贵州快3 2019任务网赚日赚100 盛通彩票网 不开网店怎么上网赚钱 2019网赚棋牌项目 皇鼎彩票 2019国外挂机网赚联盟