前言:

这段时间小猪花了不少功夫在研究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!

在ASP.NET MVC中使用Area的更多相关文章

  1. 在ASP.NET MVC中使用Area区域

    在大型的ASP.NET mvc5项目中一般都有许多个功能模块,这些功能模块可以用Area(中文翻译为区域)把它们分离开来,比如:Admin,Customer,Bill.ASP.NET MVC项目中把各 ...

  2. ASP.NET MVC中Area的另一种用法

    ASP.NET MVC中Area的另一种用法 [摘要]本文只是为一行代码而分享 context.MapRoute("API", "api/{controller}/{ac ...

  3. 在ASP.Net MVC 中,如何在Global.asax中配置一个指向Area内部的默认Route

    ASP.Net MVC 中配置Route的时候可以设置一个默认的Route. 比如我要在输入http://localhost的时候默认进入http://localhost/home/index.可以在 ...

  4. MVC中实现Area几种方法

    概述        ASP.NET MVC中,是依靠某些文件夹以及类的固定命名规则去组织model实体层,views视图层和控制层的.如果是大规模的应用程序,经常会由不同功能的模块组成,而每个功能模块 ...

  5. Asp.net mvc 中View 的呈现(二)

    [toc] 上一节介绍了 Asp.net mvc 中除 ViewResult 外的所有的 ActionResult,这一节介绍 ViewResult. ViewResultBase ViewResul ...

  6. 5. ASP.NET MVC 中的Areas【区域】是什么

    [PS返回上一篇:-->4.ASP.NET MVC 5.0 视图之模型绑定] 从ASP.NET MVC 2.0开始,微软就提供了一个新特性:Areas[区域].Areas仅仅是用来将大型程序拆分 ...

  7. 2.ASP.NET MVC 中使用Crystal Report水晶报表

    上一篇,介绍了怎么导出Excel文件,这篇文章介绍在ASP.NET MVC中使用水晶报表. 项目源码下载:https://github.com/caofangsheng93/CrystalReport ...

  8. 关于 ASP.NET MVC 中的视图生成

    在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 通 ...

  9. 在Asp.Net MVC 中配置 Serilog

    Serilog 是一种非常简便记录log 的处理方式,使用Serilog可以生成本地的text文件, 也可以通过 Seq 来在Web界面中查看具体的log内容. 接下来就简单的介绍一下在Asp.Net ...

随机推荐

  1. adb_亮屏

    来自:http://justonlypiano.blogspot.tw/2013/08/adbandroidandroid-phone-screen-off-via.html 更多内容请查看:http ...

  2. poj1434Fill the Cisterns!(二分)

    链接 题目说给你n个水箱,初始是没有水的,每个的高低位置可能不同,给了你初始的水箱底部所处的水平线位置,问给你V体积水时,水的水平线位置. 直接二分位置p,对于每一个底部低于水平线位置的水箱,里面的水 ...

  3. Python学习(11)字典

    目录 Python 字典 访问字典中的值 修改字典 删除字典元素 字典键的特性 字典内置函数&方法 Python 字典(Dictionary) 字典是另一种可变容器模型,且可存储任意类型对象. ...

  4. C10K及C100K问题探讨 & 怎么应对大流量大并发

    首先开宗明义,离开业务单独讨论并发,都是扯淡. 就像 https://www.zhihu.com/question/20493166/answer/15998053 这里面说的 谈并发必然要谈业务,空 ...

  5. unique-substrings-in-wraparound-string(好)

    https://leetcode.com/problems/unique-substrings-in-wraparound-string/ 好,我自己做出来的.多总结规律,多思考. package c ...

  6. Manacher 算法(hdu 3068 && hdu 3294)

    今天打算补前晚 BC 的第二题,发现要用到能在 O(n) 时间求最大回文子串长度的 Manacher 算法,第一次听,于是便去百度了下,看了大半天,总算能看懂了其思想,至于他给出的代码模板我没能完全看 ...

  7. pl/sql developer执行光标所在行

    一.发现问题 需要执行某一行语句时,需要选中该行语句,点击F8才行. 二.解决问题 中文版:工具->首选项->SQL窗口->自动选择语句 英文版:tools->preferen ...

  8. MySQL在windows系统中修改datadir路径后无法启动问题,报错1067

    windows server2008下如何更改MySQL数据库的目录的帖子已经很多了,这里简单介绍一个步骤,如果不成功请先查看其它帖子. 更改默认的mysql数据库目录 将 C:\Documents ...

  9. Mybatis关联查询,查询出的记录数量与数据库直接查询不一致,如何解决?

    <select id="findUserInfoListForMap"    resultMap="BaseResultMap">  SELECT  ...

  10. 【转】 Android自定义捕获Application全局异常

    大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了 ...