ASP.NET MVC 中實現View與Controller分離


一、開篇題外話

我經常會在博客園逛來逛去,看過很多大牛們的Blog,我很少在這塊技術天地活動,之前有發表過幾篇日志,好像大部分是和電商有關,作為一個多年的開發人員,很少在這里分享,之前一直在CSDN上活動,因為我的Blog在那上邊的排名1000多名,我想好好維護好CSDN,但是我發現越來越多的同行們都轉戰博客園。所以我也跟風來到此塊寶地,我來了,你在哪?

二、分離的優點

1.松耦合:耦合是指一個系統的組件之間的相關程度。越少的組件相互依賴,那么這個系統的重用性和靈活性就越好。

2.更好的團隊分工合作,專門的工程師負責Controller

IC376097

三、背景

在看博客園創始人@dudu博客的時候,發現他就是這樣做的,這個是他的項目截圖:

2012121411510365我想,我的項目中應該也要這樣來實現,下面我們一步一步來分解。

四、實戰

1、新建一個空的MVC 項目,命名為:NaoGuaZi.MvcExample12。如何新建在此不作一一介紹,

如果不分離的話,我們就開始在該項目下的Controllers文件夾添加Controller,但是我們現在的作法是將Controller作為一個單獨的項目,這個項目僅僅用來做View的操作,那究竟怎么實現呢?

具體請猛擊下載源碼

2、新建一個類庫,命名為NaoGuaZi.MvcExample12.Controllers 如下圖所示

image

3、在此類庫中添加System.Web.dll,System.Web.Abstractions.dll,System.Web.Mvc.dll,System.Web.Routing.dl的引用,如下圖所示

image

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運行項目,我們就可以看到成功運行的結果了。如下圖所示:

image在實踐過程中可能出現的錯誤匯總:

錯誤1:如下圖所示

image錯誤原因: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即可成功訪問。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM