博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在ASP.NET MVC中使用Area
阅读量:6426 次
发布时间:2019-06-23

本文共 2438 字,大约阅读时间需要 8 分钟。

前言:

这段时间小猪花了不少功夫在研究ASP.NET MVC的源码上面,可谓思想是了解了不少,用的上用不上却是另外一回事了。!

应用场景:

ASP.NET MVC中,是依靠某些文件夹以及类的固定命名规则去组织model实体层,views视图层和控制层的。如果是大规模的应用程序,经常会由不同功能的模块组成,而每个功能模块都由MVC中的三层所构成,因此,随着应用程序规模的增大,如何组织这些不同功能模块中的MVC三层的目录结构,有时对开发者来说显得是种负担。

另一个问题就是Controller不允許有相同命名的存在,偏偏模块中常有父子关系,有时子模块命名相同就会造成错误。

幸运的是,ASP.NET MVC允许开发者将应用划分为“区域”(Area)的概念。

Area(区域)简介:

每个区域都是按照asp.net mvc的规定对文件目录结构和类的命名规则进行命名。添加方法也很简单,右击项目,点击添加区域,在弹出框里写上Area的名称点击确定即可。

 *     1、新建 Area:右键 -> Add -> Area...

 *     2、继承 AreaRegistration,配置对应此 Area 的路由
 *     3、在 Global 中通过 AreaRegistration.RegisterAllAreas(); 注册此 Area
 *     4、有了 Area,就一定要配置路由的命名空间

Area的路由

在添加好了区域之后,vs会自动帮我们注册Area的路由信息:

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 = "Console", action = "Login", id = UrlParameter.Optional }        );    }}

问题

试想如果这时候有这样的情形:

如果有一个Area叫Database,在它的下面有一个Controller名字叫做Browse。

另外我在顶层也有一个Controller,名字也叫Browse。

那么我们在输入http://localhost/Browse,我们得到的将是一个异常: Multiple types were found that match the controller named 'Browse'. 

而输入http://localhost/Database/Browse,我们却能够正常地访问到 MvcApplication.Areas.Database.Controllers.BrowseController。

原来:

在注册Area的路由时,如果没有填写命名空间的话,则会默认使用Area所在的命名空间。如此一来,使用Area的路由在寻找Controller时,只会在Area所在的空间下寻找相应的Controller,那就不存在与顶层Controller的冲突问题了,可是顶层的同名Controller问题如何解决呢,这个好办,在顶层路由映射的时候主动加上命名空间吧,这样子就皆大欢喜,你用你的Browse,我用我的Browse,互不相干。

public static void RegisterRoutes(RouteCollection routes){     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");     routes.MapRoute(        "Default", // Route name        "{controller}/{action}/{id}", // URL with parameters        new { controller = "Home", action = "Index", id = UrlParameter.Optional },// Parameter defaults        new[] { "Web.Controllers" }// Namespaces 引入默认的命名空间        );}

让起始页为某Area的页面:

修改RoutConfig代码:

public static void RegisterRoutes(RouteCollection routes){    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");    routes.MapRoute(        name: "Default",        url: "{controller}/{action}/{id}",        defaults: new { controller = "Console", action = "Login", id = UrlParameter.Optional }    ).DataTokens.Add("area","Admin");}

注意后面的DataTokens.Add方法!

Done!

转载于:https://www.cnblogs.com/smallerpig/p/3646191.html

你可能感兴趣的文章
常用的数学函数
查看>>
祭奠我们渐渐远去的青春
查看>>
Linux---Samba安装
查看>>
GomTV版MV介绍
查看>>
Active Directory管理之十二:升级Active Directory(下)
查看>>
ie中placeholder属性不支持,js解决
查看>>
[原创]如何从数据库层面检测两表内容的一致性
查看>>
BIOS和CMOS的区别,供大家学习。
查看>>
F5 Networks:让BYOD高效安全地接入企业内网
查看>>
我有一个梦想
查看>>
android webview onJsAlert只调用一次的问题
查看>>
Linux开机启动模式的设置
查看>>
OSPF:DR、BDR选举算法
查看>>
Lync 2013部署图片赏析-Lync 2013 安装部署向导
查看>>
领域驱动设计之工厂模式实现场景
查看>>
centos7.2安装mysql5.7.13实现 ssl 安全连接的主从复制
查看>>
粗看了一下html5
查看>>
IO模型
查看>>
2018.3.7 11周2次课
查看>>
我的友情链接
查看>>