一、開篇題外話
我經常會在博客園逛來逛去,看過很多大牛們的Blog,我很少在這塊技術天地活動,之前有發表過幾篇日志,好像大部分是和電商有關,作為一個多年的開發人員,很少在這里分享,之前一直在CSDN上活動,因為我的Blog在那上邊的排名1000多名,我想好好維護好CSDN,但是我發現越來越多的同行們都轉戰博客園。所以我也跟風來到此塊寶地,我來了,你在哪?
二、分離的優點
1.松耦合:耦合是指一個系統的組件之間的相關程度。越少的組件相互依賴,那么這個系統的重用性和靈活性就越好。
2.更好的團隊分工合作,專門的工程師負責Controller
三、背景
在看博客園創始人@dudu博客的時候,發現他就是這樣做的,這個是他的項目截圖:
我想,我的項目中應該也要這樣來實現,下面我們一步一步來分解。
四、實戰
1、新建一個空的MVC 項目,命名為:NaoGuaZi.MvcExample12。如何新建在此不作一一介紹,
如果不分離的話,我們就開始在該項目下的Controllers文件夾添加Controller,但是我們現在的作法是將Controller作為一個單獨的項目,這個項目僅僅用來做View的操作,那究竟怎么實現呢?
具體請猛擊下載源碼
2、新建一個類庫,命名為NaoGuaZi.MvcExample12.Controllers 如下圖所示
3、在此類庫中添加System.Web.dll,System.Web.Abstractions.dll,System.Web.Mvc.dll,System.Web.Routing.dl的引用,如下圖所示
4、新建一個 GlobalRoutesTable類,用來注冊路由,通過該類銜接Controler與View,這個類會在View的Global.asax中Application_Start使用到。
按照國際慣例上代碼
public static class GlobalRoutesTable { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); //default routes routes.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new string[] {"NaoGuaZi.MvcExample12.Controllers"} ); } }
6、新建類HomeController類,該類繼承System.Web.Mvc.Controller
public class HomeController:Controller { public ViewResult Index() { return View(); } }
7、將現有項目NaoGuaZi.MvcExample12.Controllers.dll添加到NaoGuaZi.MvcExample12項目中,然后在global.asax中的Application_Start中加入代碼:
NaoGuaZi.MvcExample12.Controllers.GlobalRoutesTable.RegisterRoutes(RouteTable.Routes);
8、在NaoGuaZi.MvcExample12項目中的Views下新建Home文件夾,home文件夾下建index.cshtml 視圖,然后Ctrl+F5運行項目,我們就可以看到成功運行的結果了。如下圖所示:
在實踐過程中可能出現的錯誤匯總:
錯誤1:如下圖所示
錯誤原因:View中已經注冊了一個Default的路由
解決辦法:將Views中的默認的Default路由名稱改成Default1或其他,或者將RegisterRoutes(RouteTable.Routes);注釋掉。
五、延伸
可能大家會想到,如果在Controllers中建文件夾,這樣更有利於層次分明,那該怎么實現呢?
博客園創始人@dudu的解決方案中提到了用Area來解決,然后到最后他采納了評論中的配置路由的方案,經過我的測試,這中方案測試不通過,所以還是采用Area的方式來實現。我們緊接上面的內容
1、在NaoGuaZi.MvcExample12.Controllers項目中新建文件夾Admin
2、在Admin文件夾下新建AdminAreaRegistration類,該類繼承AreaRegistration
3、在類中插入如下代碼:
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 { controller = "Home", action = "Index", id = UrlParameter.Optional }, new string[] {"NaoGuaZi.MvcExample12.Controllers.Admin"} ); } }
4、新建HomeController類繼承Controller
public ViewResult Index() { return View("~/Views/Admin/Home/Index.cshtml"); }
5、在NaoGuaZi.MvcExample12項目中的Views下新建Admin/Home文件夾,新建名為Index.cshtml視圖。然后Ctrl+F5運行,在瀏覽器中輸入http://localhost:端口號/admin/home/index即可成功訪問。