惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Blog of Author Tim Ferriss
S
Securelist
D
Docker
The Register - Security
The Register - Security
GbyAI
GbyAI
Recorded Future
Recorded Future
Engineering at Meta
Engineering at Meta
Stack Overflow Blog
Stack Overflow Blog
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
罗磊的独立博客
博客园 - 【当耐特】
F
Full Disclosure
WordPress大学
WordPress大学
腾讯CDC
小众软件
小众软件
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
SecWiki News
SecWiki News
L
Lohrmann on Cybersecurity
I
InfoQ
MyScale Blog
MyScale Blog
量子位
Cyberwarzone
Cyberwarzone
博客园 - 三生石上(FineUI控件)
The Hacker News
The Hacker News
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
博客园_首页
H
Help Net Security
K
Kaspersky official blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Webroot Blog
Webroot Blog
Blog — PlanetScale
Blog — PlanetScale
V
Vulnerabilities – Threatpost
Y
Y Combinator Blog
The Cloudflare Blog
P
Proofpoint News Feed
V
Visual Studio Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
爱范儿
爱范儿
P
Privacy International News Feed
Security Archives - TechRepublic
Security Archives - TechRepublic
The GitHub Blog
The GitHub Blog
C
Cybersecurity and Infrastructure Security Agency CISA
B
Blog RSS Feed

博客园 - 脑瓜子

博文阅读密码验证 - 博客园 开发 SQLite学习手册(转) 缓存数据库redis、memcached。 MongoDB 资源集锦 在GOOGLE浏览器中模拟移动浏览器 调试Web app 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 博文阅读密码验证 - 博客园 Intelligencia.UrlRewriter在IIS 7.0下的完全配置攻略 脑瓜子的文章导航 脑瓜子的学院系列文章汇总 博文阅读密码验证 - 博客园 ASP.NET中上传图片检测其是否为真实的图片 防范病毒上传至服务器 [开源]C#中开源软件大汇总(外国的) 百度知道回答内容呈现给大家分享下 团购网是否能拯救那些因为运费问题而滞销的农产品? 个人的用户体验感想+点评jobily 发的日志 作为一个技术人员,终于有了自己的第一个作品 博文阅读密码验证 - 博客园 HttpHandler(ashx)中获取Session状态 - 脑瓜子 - 博客园
ASP.NET MVC 中实现View与Controller分离
脑瓜子 · 2014-02-13 · via 博客园 - 脑瓜子

一、开篇题外话

我经常会在博客园逛来逛去,看过很多大牛们的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打开,没有涉及到具体业务的实现,只涉及思想。