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即可成功访问。

  • 相关阅读:
    idea jsp无法加载<c:foreach>循环遍历数据
    java POI读取Excel文件
    Javaweb中请求的资源[/Servlet]不可用解决方案
    大作业第一阶段冲刺(一)
    hive中sql左外连接查询列值为null
    关于ECharts在jsp页面无法显示的问题
    echarts通过ajax实现数据加载
    读书笔记
    解决:[Err] 1064
    idea启动Tomcat报错Artifact testdemo1:war exploded: Error during artifact deployment. See server log for details.问题解决
  • 原文地址:https://www.cnblogs.com/sunjie9606/p/4329815.html
Copyright © 2011-2022 走看看