MVC中实现Area几种方法
概述
ASP.NET MVC中,是依靠某些文件夹以及类的固定命名规则去组织model实体层,views视图层和控制层的。如果是大规模的应用程序,经常会由不同功能的模块组成,而每个功能模块都由MVC中的三层所构成,因此,随着应用程序规模的增大,如何组织这些不同功能模块中的MVC三层的目录结构,有时对开发者来说显得是种负担。所幸,MVC提供了Area机制,让开发人员可以对项目实现模块的管理。
Area就是严格的按照MVC的规定对文件目录结构和类的命名规则进行命名。我以社交网站的开发为例,主要介绍下如何实现自定义Area。
Default Area
如社交网站一般会包括微博,贴吧,群组,资讯等主要的模块。采用MVC的Area机制实现开发,我们只要为项目添加4个Area即可,如图所示:

Custom Area
自定义Area的实现主要有两种方式。
1. 借助Default Area。
a.在SNS Solution中添加一个新的MVC项目Group,关键点是要将新项目的位置保存在SNS项目的Areas目录下。
b.删除Group项目下的Web.config和Global.asax文件。
c.在Group项目下添加类文件GroupAreaRegistration.cs,该类继承AreaRegistration,并重写AreaName属性和RegisterArea方法。

d.在SNS中添加对Group的引用。
2. 完全自定义实现。
所谓完全自定义就是对模块的添加位置不再一味的要求到Areas目录下,而是开发人员指定的某个目录。
所以我们可以在SNS项目中添加以各新的目录Applications。并在该目录下添加新的MVC项目,
删除项目下的Web.config和Global.asax文件and添加类文件GroupAreaRegistration.cs,该类继承AreaRegistration,并重写AreaName属性和RegisterArea方法。

添加引用到SNS。到这里之前的基本一样。主要区别就在这里了,先说下实现,然后会对原理进行下分析。
1. 在SNS项目中添加一个如下的类。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing; namespace MvcApplication1
{
public class RazorEngine : RazorViewEngine
{
public RazorEngine()
{
base.AreaViewLocationFormats = new string[]{
"~/Applications/{2}/Views/{1}/{0}.cshtml"
};
base.AreaPartialViewLocationFormats = new string[]{
"~/Applications/{2}/Views/{1}/{0}.cshtml"
};
base.AreaMasterLocationFormats = new string[]{
"~/Applications/{2}/Views/{1}/{0}.cshtml"
};
}
public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
string area = GetAreaName(controllerContext.RouteData);
controllerContext.RouteData.DataTokens["area"] = area;
return base.FindView(controllerContext, viewName, masterName, useCache);
} public string GetAreaName(RouteBase route)
{
IRouteWithArea routeWithArea = route as IRouteWithArea;
if (routeWithArea != null)
{
return routeWithArea.Area;
}
Route route2 = route as Route;
if (route2 != null && route2.DataTokens != null)
{
return route2.DataTokens["area"] as string;
}
return null;
}
public string GetAreaName(RouteData routeData)
{
object obj;
if (routeData.DataTokens.TryGetValue("area", out obj))
{
return obj as string;
}
if (GetAreaName(routeData.Route) == null)
{
routeData.Values.TryGetValue("area", out obj);
}
return obj as string;
} }
}
最后在SNS的修改Global.asax。如下:

重要的一点就是要把新添加的mvc的项目生成dll的的位置指向根目录下的bin。
MVC中实现Area几种方法的更多相关文章
- Asp.net MVC 中超链接的三个方法及比较
在Asp.net WebForm开发中,我们通过a标签进行跳转时,通常的写法是:<a href="index.aspx">首页</a>, 在Asp.net ...
- MVC中常用的跳转方法
MVC中常用的跳转方法 这里总结了几种MVC中的跳转方式,主要汇总了前端页面跳转,后台的跳转,和过滤器中的跳转方式. 1.在前端页面的跳转方式 <!--属性形式---> <a hre ...
- 解析Jquery取得iframe中元素的几种方法
iframe在复合文档中经常用到,利用jquery操作iframe可以大幅提高效率,这里收集一些基本操作,需要的朋友可以参考下 DOM方法:父窗口操作IFRAME:window.frames[&q ...
- 转载:WinForm中播放声音的三种方法
转载:WinForm中播放声音的三种方法 金刚 winForm 播放声音 本文是转载的文章.原文出处:http://blog.csdn.net/jijunwu/article/details/4753 ...
- java中需要关注的3大方面内容/Java中创建对象的几种方法:
1)垃圾回收 2)内存管理 3)性能优化 Java中创建对象的几种方法: 1)使用new关键字,创建相应的对象 2)通过Class下面的new Instance创建相应的对象 3)使用I/O流读取相应 ...
- MATLAB中多行注释的三种方法
MATLAB中多行注释的三种方法 A. %{ 若干语句 %} B. 多行注释: 选中要注释的若干语句, 编辑器菜单Text->Comment, 或者快捷键Ctrl+R 取消注释: 选中要取消注释 ...
- C#中文件下载的几种方法演示源码
内容过程,把内容过程比较重要的内容做个珍藏,如下的内容是关于C#中文件下载的几种方法演示的内容,应该是对各朋友有较大好处. using System;using System.Data;using S ...
- Jquery取得iframe中元素的几种方法(转载)
iframe在复合文档中经常用到,利用jquery操作iframe可以大幅提高效率,这里收集一些基本操作 DOM方法:父窗口操作IFRAME:window.frames["iframeSon ...
- js 跨域 Jquery取得iframe中元素的几种方法
http://www.jb51.net/article/34942.htm 收集利用Jquery取得iframe中元素的几种方法 : 父页面访问子页面 $(document.getElementByI ...
随机推荐
- Android笔记——Android中visibility属性VISIBLE、INVISIBLE、GONE的区别
在Android开发中,大部分控件都有visibility这个属性,其属性有3个分别为"visible "."invisible"."gone&quo ...
- Android Fragment 使用技巧
1. Fragment 使用时要有一个无参构造函数 如果没有无参构造函数,而是像按照普通类来使用,只创建有参构造函数,则会出现 android.support.v4.app.Fragment$Inst ...
- mybatis中的#和$的区别
#相当于对数据 加上 双引号,$相当于直接显示数据 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sq ...
- Distribution2:Distribution Writer
Distribution Writer 调用Statement Delivery 存储过程,将Publication的改变同步到Subscriber中.查看Publication Properties ...
- Unity3D研究院之Prefab里面的Prefab关联问题
最近在做UI部分中遇到了这样的问题,就是Prefab里面预制了Prefab.可是在Unity里面一旦Prefab预制了Prefab那么内部的Prefab就失去关联.导致与如果要改内部的Prefab需要 ...
- Hibernate的数据删除,更改
其他未给出代码,请参考上一篇.... 一.数据的删除 方法1.从“多”的一方进行数据的删除 books.hbm.xml文件不变: <many-to-one name="publishe ...
- 如何利用Oracle外部表导入文本文件的数据
同事最近在忙数据一致性比对工作,需要对不同文本文件中的数据进行比对,有的文件较大,记录较多,如果用普通的文本编辑器打开的话,很显然,会很卡,甚至打不开. 基于此,可将该文本文件的数据导入到数据库中,在 ...
- 制作动画或小游戏——CreateJS基础类(一)
前面曾经记录过Canvas的基础知识<让自己也能使用Canvas>,在实际使用中,用封装好的库效率会高点. 使用成熟的库还能对基础知识有更深入的理解,CreateJS是基于HTML5开发的 ...
- 3d效果的图片轮播
CSS3的3d变换 CSS3给我们提供了一个新的功能,那就是3d变换.3d变换和2d变换的基本API函数类似,只不过多了些在Z轴上的操作,不难使用. 但是,为了让元素拥有3d变换的功能,我们需要给他的 ...
- 移动端(h5)开发笔记
1.禁止缩放+禁止缓存 <head> <meta charset="UTF-8" /> <meta name="viewport" ...