zoukankan      html  css  js  c++  java
  • 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即可成功访问。

    image

    完整代码下载 VS2012打开,没有涉及到具体业务的实现,只涉及思想。

  • 相关阅读:
    服务部署 RPC vs RESTful
    模拟浏览器之从 Selenium 到splinter
    windows程序设计 vs2012 新建win32项目
    ubuntu python 安装numpy,scipy.pandas.....
    vmvare 将主机的文件复制到虚拟机系统中 安装WMware tools
    ubuntu 修改root密码
    python 定义类 简单使用
    python 定义函数 两个文件调用函数
    python 定义函数 调用函数
    python windows 安装gensim
  • 原文地址:https://www.cnblogs.com/naoguazi/p/MVC_View_Controller.html
Copyright © 2011-2022 走看看