詳解ASP.NET MVC 2中的Area特性
51CTO在1月曾專訪過微軟MVP衣明志老師,主要話題就是ASP.NET MVC 2。其中我們曾談到Area特性,在這里特組織這篇文章供大家了解ASP.NET MVC 2中的Area。想學習更多ASP.NET MVC,請參考教程《ASP.NET MVC框架視頻教程》
最近裝了mvc2 pr2版本,看了下說明文檔,里面著重提示說更新了area項目,因此著重看了一下。若干心的,和大家共享,有錯沒錯,歡迎大家拍磚。
沒有Areas前相同問題的處理
在mvc1.0時代,如果要將網(wǎng)站按目錄結(jié)構(gòu)來區(qū)分。例如
- Website/Index
- Admin/ Index
- User/ Index
- ……/……
通常都是在Views下面建立若干個和Controller相對應的目錄,然后在里面放置aspx頁面
- Views\Website\Index
- Views\Admin\Index
- Views\User\Index
- Views\.......\.......
這樣建立若干個目錄
其實這樣也沒什么不好,***不好的可能就是隨著業(yè)務的需要,結(jié)構(gòu)需求會越來越多,views目錄下面的文件夾越來越多,更或者你需要更細結(jié)構(gòu)的頁面路徑,例如:
- Website/Product/Index
- Website/Catalog/Index
- Website/Contect/Index
當然,你可以用UrlRouteing或者ViewEngine搞定這些問題。但是毫無疑問,隨著網(wǎng)站的運行日久,同一個Controller目錄下的文件會越來越多,對于同一個Controller下的ActionResult的命名和UrlRouting里面的維護帶來不小的麻煩。給管理帶來不方便【個人理解】。
現(xiàn)在出Areas之后,這個問題有所緩解。還是如上的Url
- Website\Product\Index
- Website\Catalog\Index
- Website\Order\Index
- Website\Contact\Index
可以使用mvc2.0新增的Area來解決這個問題
建立項目
首先,用mvc2建立一個新項目,在網(wǎng)站根目錄下建立Areas文件夾,在Areas文件夾建立你要區(qū)分的目錄,例如本例的Website,然后繼續(xù)在Website目錄下增加Views目錄,繼續(xù)在views目錄下增加需要分類管理Controller目錄和建立aspx文件。使文件結(jié)構(gòu)形成
- Areas\Website\Views\Product
- Areas\Website\Views\ Catalog
- Areas\Website\Views\ Order
- Areas\Website\Views\ Contact
到原有默認的views目錄將web.config復制到現(xiàn)在的新的views目錄,你甚至現(xiàn)在可以把原有的views目錄刪除掉
建立Areas區(qū)域UrlRouting
隨便找個地方,建立一個新的類,繼承AreaRegistration實現(xiàn)抽象類
修改Global.sas
- protected void Application_Start()
- {
- AreaRegistration.RegisterAllAreas();
- //注冊區(qū)域Url規(guī)則,注意先后順序
- RegisterRoutes(RouteTable.Routes);
- }
為區(qū)域頁面建立Controller類沒什么區(qū)別,可以建立在另外一個外部類庫項目上,***需要注意的就是命名空間需要和注冊Area規(guī)則的類的命名空間的前導一致。我們知道,在不使用Areas的時候Controller是不受namespace約束的。也就是說只要你有一個Controller名,而不管他在哪個命名空間下都是可以起作用的,如果我們在不同的命名空間建立2個相同的Controller類名,編譯的時候不會出錯,但是運行mvc網(wǎng)站的時候會提示存在2個相同的Controller類,系統(tǒng)不知道使用哪個。但是Areas卻有所限制,他一定要命名空間的前導和AreaRegistration類得命名空間相同。例如:我建立的AreaRegistration網(wǎng)站項目命名空間為Valor.Asmyna.Areas.Website然后我將Controller分開作為一個獨立的類庫,如果我隨便寫一個命名空間空間,這個Controller對于Area里面的views是不起作用的,但是他卻對原始Views目錄的Controller起作用,只有將他的命名空間設(shè)置成Valor.Asmyna.Areas.Website.xxx.xxx的前導才起作用
- namespace Valor.Asmyna.Areas.Website
- {
- public class HomeController : Controller
- {
- public ActionResult Index()
- {
- ViewData["title"] = "Website/Home/Index";
- return View();
- }
- }
- public class ProductController : Controller
- {
- public ActionResult Index()
- {
- ViewData["title"] = "Website/Product/Index";
- return View(); }
- }
- public class ContentController : Controller
- {
- public ActionResult Index()
- {
- ViewData["title"] = "Website/Content/Index";
- return View();
- } }
- }
Ok,到瀏覽器測試一下看看
Area結(jié)構(gòu)完全一致會出現(xiàn)的問題
我們繼續(xù)在Area目錄下增加一個Home目錄,在他的Veiws目錄下也增加三個相同的controller目錄
直接在剛才注冊Website AreaRegistration命名空間為他注冊一個Area規(guī)則,用默認系默認的Controller為Home.,
對2個路徑進行訪問:
/Website/Product
/Home/Product
這個時候controller對于這2個area目錄的views都能起作用。在頁面打印得到的結(jié)果一致
顯然這樣是不對的.由此我們剛才想到Area的Controller的選擇名命名空間限制問題。那我們他們分開來注冊看看。修改Home區(qū)域的AreaRegistration的命名空間和在為HomeArea建立一個Controller類,使他們的命名空間一致。這次我們用Valor.Asmyna.Areas.Website
- namespace Valor.Asmyna.Areas.Home{
- public class HomeController : Controller
- {
- public ActionResult Index()
- {
- ViewData["title"] = "Home/Content/Index";
- return View();
- } }
- public class ProductController : Controller
- {
- public ActionResult Index()
- {
- ViewData["title"] = "Home/Content/Index";
- return View();
- }}
- public class ContentController : Controller
- {
- public ActionResult Index()
- {
- ViewData["title"] = "Home/Content/Index";
- return View();
- }
- }}
- namespace Valor.Asmyna.Areas.Home
- {
- public class HomeController : Controller
- {
- public ActionResult Index()
- {
- ViewData["title"] = "Home/Home/Index";
- return View();
- } }
- public class ProductController : Controller{
- public ActionResult Index()
- {
- ViewData["title"] = "Home/Product/Index";
- return View();
- } }
- public class ContentController : Controller
- {
- public ActionResult Index()
- {
- ViewData["title"] = "Home/Content/Index";
- return View();
- }
- }
- }
編譯之后訪問,各自分別為自己的Controller處理了
Home/Product
Website/Product
原文標題:使用mvc2里面的area讓網(wǎng)站更有條理
鏈接:http://www.cnblogs.com/tthxnz/archive/2009/11/12/1602097.html
【編輯推薦】