MVC2中Area的路由注册实现
今天碰到了一個(gè)不可思議的bug,新增的controller中任何action都無(wú)法訪問(wèn),都是返回404錯(cuò)誤。一般這種錯(cuò)誤要么是拼寫(xiě)錯(cuò)誤,要么是不小心給action加了post屬性,但是經(jīng)過(guò)初步的排查,沒(méi)有發(fā)現(xiàn)問(wèn)題。而原有的controller中任何action都訪問(wèn)正常,新增的action也沒(méi)有問(wèn)題,但是換到新創(chuàng)建的那個(gè)controller中,問(wèn)題就出現(xiàn)。于是問(wèn)題定位在新增的那個(gè)controller中。于是翻開(kāi)mvc的教程,仔細(xì)回顧了一下MVC中路由定位controller和action的過(guò)程,也沒(méi)發(fā)現(xiàn)問(wèn)題。最后仔細(xì)比對(duì)了一下代碼,居然發(fā)現(xiàn)新舊controller的命名空間不一樣,然后有查看了實(shí)現(xiàn)AreaRegistration的注冊(cè)類(lèi)iRecruiteAreaRegistration,只要controller的命名空間和iRecruiteAreaRegistration的命名空間一致的,都能正常尋找到action。
仔細(xì)看了一下MVC2中關(guān)于area注冊(cè)路由的實(shí)現(xiàn)方式,確定area中的controller、action的路由跟命名空間是緊密聯(lián)系在一起的。
MVC2中新增的area的路由也是在網(wǎng)站啟動(dòng)的時(shí)候注冊(cè)的,即global的start方法中執(zhí)行的,調(diào)用的方法是?AreaRegistration.RegisterAllAreas();這個(gè)方法遍歷程序集中個(gè)繼承了AreaRegistration類(lèi)的類(lèi)型,然后逐個(gè)調(diào)用這些類(lèi)型的RegisterArea方法。一個(gè)常見(jiàn)的AreaRegistration類(lèi)型如下。通常如果通過(guò)visual studio添加的area都自動(dòng)生成了這個(gè)類(lèi)。(我這里的area是手動(dòng)生成的)。那么areaRegistration會(huì)關(guān)注哪些controller呢?實(shí)際上AreaRegistration類(lèi)型會(huì)將其所在的命名空間保存在DataTokens["Namespaces"]中,在接收請(qǐng)求的時(shí)候就只會(huì)在這些命名空間或子空間中尋找controller,如果命名空間寫(xiě)錯(cuò)了,當(dāng)然就無(wú)法識(shí)別了。因此實(shí)際上area注冊(cè)僅僅起到的作用是,將area的名字和命名空間關(guān)聯(lián)起來(lái)。因此如果要導(dǎo)航area中的controller必須首先提供area名字,這樣就不會(huì)找到其他命名空間下的controller了。
????? 文字描述比較多,具體可參考Apress.Pro.ASP.NET.MVC.2.Framework一書(shū)中Chapter8關(guān)于urls和routes的描述,非常的詳細(xì)。
?
View Code ?1?namespace?Baza.Ats.Areas.iRecruite?2?{
?3?????public?class?iRecruiteAreaRegistration?:?AreaRegistration
?4?????{
?5?????????public?override?string?AreaName
?6?????????{
?7?????????????get
?8?????????????{
?9?????????????????return?"iRecruite";
10?????????????}
11?????????}
12?
13?????????public?override?void?RegisterArea(AreaRegistrationContext?context)
14?????????{
15?????????????context.MapRoute(
16?????????????????"iRecruite_default",
17?????????????????"iRecruite/{controller}/{action}/{id}",
18?????????????????new?{?action?=?"Index",?id?=?UrlParameter.Optional?}
19?????????????);
20?????????}
21?????}
22?}
?
轉(zhuǎn)載于:https://www.cnblogs.com/shenba/archive/2011/11/24/2262245.html
總結(jié)
以上是生活随笔為你收集整理的MVC2中Area的路由注册实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle Golden Gate 系
- 下一篇: c++面试题(1)