第一部分:(摘选自http://www.cnblogs.com/HuiTai/archive/2012/07/24/MVC-12.html 辉太)

(这部分作者写的很详细,直接摘过来了)

MVC框架支持组织一个web应用程序到的区域,每个区域代表应用程序的功能性组比如账单、客户支持,等等,这在一个大的项目是非常有用的,那里有 一套单一的文件夹,所有的控制器,视图和模型可以变得难以管理。每个MVC区域是有自己的文件夹结构,允许您分开管理。这使得它更显而易见哪个项目元素相 互关联应用程序的功能区域,这有助于多个开发人员同事处理项目而没有彼此胡想不干扰。区域是支持主要通过路由机制。

我们从新新建一个MVCweb应用程序("MVCArea"),创建好项目,我们直接演示怎么给项目添加一个区域进来具体如下图3.-4.

图3.图4.

当我们创建好我们的区域之后项目的结构会变成如下图5所示。

图 5.

OK这里你可以看一套类似与MVC文件机制东东出来,这个就是我们创建的区域关于这个东西后面慢慢来学习他,我们现在只关心他那个自动创建 AdminAreaRegistration.cs的文件里面是怎么一回事,不看内容就凭着这个名字猜一下,大概就路由扯上关系了。OK,打开看 看,AdminAreaRegistration.cs的代码如下:

using System.Web.Mvc;namespace MvcArea.Areas.Admin
{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 { action = "Index", id = UrlParameter.Optional });}}
}

OK,可以看出上面代码我加粗标识的RegisterArea方法十分有意思,在这个区域里注册一个路由的URL模式"  Admin/{controller}/{action}/{id}",当然我们可以在这里定义其他的URL模式,但是你要知道你这这里定义的话只在该区 域里有效,也就是你额外定义的路由机制的持有权在该区域内。

我们不需要采取任何行动来确保这个注册方法被调用。因为Global.asax文件里的Application_Start方法在我们创建区域的时 候为自动为我们注册进去,那么我们来打开Global.asax文件里的Application_Start方法看看,具体代码如下:

        protected void Application_Start(){AreaRegistration.RegisterAllAreas();RegisterGlobalFilters(GlobalFilters.Filters);RegisterRoutes(RouteTable.Routes);}

可以看到是OK的,接下我们在我们创建的Admin区域里添加一个控制器("Controller")和方法("Action")和一些视图("View")来看看效果,首先添加一个控制器("Controller"),如下图6.

图6.创建HomeController,具体的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;namespace MvcArea.Areas.Admin.Controllers
{public class HomeController : Controller{//// GET: /Admin/Home/public ActionResult Index(){return this.View();}}
}

OK,我们在创建一个视图,如下图7.

图7。创建好Index.cshtml,页面的代码如下:

@{ViewBag.Title = "Index";
}<h2>Admin Area Index</h2>

OK,我们试着运行一下我们的Web项目,并且访问一下他的路由" /Admin/Home/Index",结果如下图8.

图8.

貌似我们撒了一个谎言,我们试着访问一下我们web项目的根路径看看什么效果,运行如下图9.

图9.

OK,MVC路由机制一下找到了2个"HomeController"这下不知道去那个,就出错了!

当一个地区注册,任何路由,我们定义仅限于名称空间关联该区域。这就是我们为什么请求" /Admin/Home/Index "的时候。路由机制找到"HomeController"的命名空间MvcArea.Areas.Admin.Controllers。但 是 Global.asax文件的机制可不是这个样子的,来看看我们默认的 Global.asax文件是怎么搞的,具体代码如下:

        public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute("Default", // Route name"{controller}/{action}/{id}", // URL with parametersnew { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults);}

名为default的路由转换传入的URL从浏览器到主控制器HomeController行动上Index方法。在这一点上,我们得到一个错误, 因为有没有命名空间的限制这条路线和MVC框架,可以看到两个的HomeController类。所以我们就可以看到上面悲剧发生,我们对 Global.asax文件做简单的处理,具体操作如下:

 public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute("Default", // Route name"{controller}/{action}/{id}", // URL with parametersnew { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaultsnew[] { "MvcArea.Controllers" } //指定命名空间);}

这种变化,确保在控制器的主要项目,给予优先解决的请求。

MVC框架中检测到当前的请求与特定的区域, 然后出站的URL生成将会找到一个匹配只有在路线定义为该领域。比如在我们的Index.cshtml修改如下代码所示:

@{ViewBag.Title = "Index";
}<h2>Admin Area Index</h2>
@Html.ActionLink("Cilck me", "About")

运行项目,可以看到如下图10的生成的连接.

图10.

当然也可以修改如下代码所示(创建一个链接到一个动作在不同的区域,或没有区域内,您必须创建一个变量调用地区并使用它来指定区域的名字你想要的):

@{ViewBag.Title = "Index";
}<h2>Admin Area Index</h2>
@Html.ActionLink("Cilck me", "About")
<br />
@Html.ActionLink("Click me to go to another area", "Index", new { area = "Support" })

运行的效果如下图11.

图11.

第二部分:(以下为个人添加)

在领域内部,各个action的访问和不使用领域时相同,只要指定action和controller即可

@Html.ActionLink("文字","ActionName","ControllerName",new{可选参数})

但是在领域间进行交互访问时,必须包含领域的路由信息,否则只能在当前领域进行查找。例如我们在首页上添加一个链接,访问Admin领域的Index页面,写法应该为:

@Html.ActionLink("test","Index","Home",new{area="Admin"},null)

我们使用 area=“Admin”来指明要访问的领域。Admin为领域名称,必须和AdminAreaRegistration.cs中的AreaName相同。

但是这样还存在另一个问题,比如在维护时修改了Controller或者Action的名称,而没有修改View中相应的链接,程序运行时将出现严重错误。在此推荐使用T4MVC,它可以很好的管理控制器、方法和视图。

在工程项目上右键点击“Manage NuGet packages..”选择安装T4MVC,安装成功后,会在项目下生成:

  • T4MVC.tt
  • T4MVC.settings.t4

T4MVC为每一个Controller创建了一个部分类,通过其中的方法我们可以很方便的取得控制器、方法或者视图。

(注:如果添加了新的文件以后,T4MVC没有更新,则右键点击 .tt文件选择Run Custom Tool,这时整个项目都会被重新编译。)

例如上面提到的跨领域访问的链接:

@Html.ActionLink("test","Index","Home",new{area="Admin"},null)
使用T4MVC以后简化为:
@Html.ActionLink("A_admin", MVC.Admin.Home.Index())

而且在View中也可以使用智能感知,非常方便。

转载于:https://www.cnblogs.com/jyan/archive/2012/07/25/2607752.html

MVC Area领域处理以及T4MVC的使用相关推荐

  1. MVC Area Usage

    ASP.NET MVC Area操作 新建 Area:右键 -> Add –> Area 继承 AreaRegistration,重写AreaName属性与RegisterArea方法 p ...

  2. MVC area出现“找到多个与名为“Home”的控制器匹配的类型”错误的解决方法

    MVC area出现"找到多个与名为"Home"的控制器匹配的类型"错误的解决方法 参考文章: (1)MVC area出现"找到多个与名为" ...

  3. MVC开发人员必备的五大工具

    1. Chirpy Zippy 下载地址:http://chirpy.codeplex.com/ 过去,在将JavaScript脚本和CSS文件部署到Web服务器之前,我习惯使用压缩工具进行压缩再部署 ...

  4. EFMVC - ASP.NET MVC 3 and Entity Framework 4.1 Code First 项目介绍

    项目概述 使用ASP.NET MVC 3.Razor.EF Code First.Unity 2.0 等等技术,演示如何创建一个ASP.NET MVC 3 的范例应用程序. 相关技术帖子: 中文: 使 ...

  5. VS2013和VS2015中MVC 区域路由匹配顺序相反

    创建测试工程 分别在vs2013和vs2015中创建mvc项目,并创建First.Second.Three三个Area,每个Area下面创建一个HomeController和Index视图.修改Rou ...

  6. .Net Web开发技术栈

    有很多朋友有的因为兴趣,有的因为生计而走向了.Net中,有很多朋友想学,但是又不知道怎么学,学什么,怎么系统的学,为此我以我微薄之力总结归纳写了一篇.Net web开发技术栈,以此帮助那些想学,却不知 ...

  7. Orchard架构介绍

    在如何使用Orchard搭建敏捷个人的网站(2)中 介绍了如何使用Orchard,但对于我们来说,更重要的是学习Orchard是如何架构的,如果我们自己编写一个类似应用该如何做.今天有空再次看看 Or ...

  8. OrchardCore 如何实现模块化( Modular )和 Multi-Tenancy

    一.概述 通常我们会在 Startup 类通过 void ConfigureServices(IServiceCollection services) 配置应用的服务.常见的形如 AddXXX 的方法 ...

  9. 求你了,听我一句劝吧,这几个玩意就别学了!

    作者:沈世钧 链接:https://www.zhihu.com/question/305924723/answer/557800752 本文我主要谈一下那些Java知识"已经过时" ...

  10. arcmap中使用python_ArcMap - 使用python更新列中的值

    概述:在外文网上,很多人都问在ArcMap中如何通过SQL修改属性字段的值,我见回答的人都说通过"Field Calculator",貌似不能直接通过SQL语句. 虽然学gis开发 ...

最新文章

  1. 李开复:发明期已过,AI科学家创业需谨慎(附演讲视频)
  2. 第二轮冲刺-Runner站立会议04
  3. fmincon函数求解过程中出现无解的情况
  4. 对于大规模机器学习的理解和认识
  5. c语言删掉注释,c语言删除注释
  6. 网信集团:一直在正常运营 高管被带走消息不实
  7. HDU 4432 Sum of divisors 2012 Asia Tianjin Regional Contest
  8. 1.material组件的安装及其使用
  9. Python数据结构与算法(2.2)——顺序表
  10. 思科GNS3和华为eNSP完美结合
  11. java的colt矩阵操作_colt-1.2.0
  12. linux 解压war到root_解压war包的解压软件 war包可以用解压工具解开吗
  13. WP模板,WP网站模板,WP网站主题模板
  14. teraterm linux环境,linux ssh telnet TeraTerm终端中文显示乱码解决方法
  15. oracle聚合函数count,聚合函数count里面加条件
  16. 计算机没声音怎么解决,【电脑没有声音】电脑没有声音怎么办_电脑没有声音是什么原因-太平洋IT百科...
  17. matlab来解决城市设计,Matlab的实际应用设计(经典).doc
  18. 地磅称重软件与ERP系统的实现
  19. 搭建k8s集群完整流程,云服务器、虚拟机均可参考
  20. 凯云水利水电工程造价管理系统 技术解析(七) 机械单价(二)

热门文章

  1. 如何在本地一键安装、重启Linux服务器和远程debug调试代码 idea
  2. ConcurrentModificationException---异常剖析
  3. SimpleDateFormat-多线程问题
  4. RDS binglog
  5. visual studio for mac在线安装网络错误
  6. Hibernate 的HQL和sql有什么区别
  7. 查看和修改mysql最大连接数
  8. 浅析总结 Java 内部类的一些使用与梳理
  9. 自定义TextView显示指定行数
  10. pvremore删除物理卷