概述

       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几种方法的更多相关文章

  1. Asp.net MVC 中超链接的三个方法及比较

    在Asp.net WebForm开发中,我们通过a标签进行跳转时,通常的写法是:<a href="index.aspx">首页</a>, 在Asp.net ...

  2. MVC中常用的跳转方法

    MVC中常用的跳转方法 这里总结了几种MVC中的跳转方式,主要汇总了前端页面跳转,后台的跳转,和过滤器中的跳转方式. 1.在前端页面的跳转方式 <!--属性形式---> <a hre ...

  3. 解析Jquery取得iframe中元素的几种方法

    iframe在复合文档中经常用到,利用jquery操作iframe可以大幅提高效率,这里收集一些基本操作,需要的朋友可以参考下   DOM方法:父窗口操作IFRAME:window.frames[&q ...

  4. 转载:WinForm中播放声音的三种方法

    转载:WinForm中播放声音的三种方法 金刚 winForm 播放声音 本文是转载的文章.原文出处:http://blog.csdn.net/jijunwu/article/details/4753 ...

  5. java中需要关注的3大方面内容/Java中创建对象的几种方法:

    1)垃圾回收 2)内存管理 3)性能优化 Java中创建对象的几种方法: 1)使用new关键字,创建相应的对象 2)通过Class下面的new Instance创建相应的对象 3)使用I/O流读取相应 ...

  6. MATLAB中多行注释的三种方法

    MATLAB中多行注释的三种方法 A. %{ 若干语句 %} B. 多行注释: 选中要注释的若干语句, 编辑器菜单Text->Comment, 或者快捷键Ctrl+R 取消注释: 选中要取消注释 ...

  7. C#中文件下载的几种方法演示源码

    内容过程,把内容过程比较重要的内容做个珍藏,如下的内容是关于C#中文件下载的几种方法演示的内容,应该是对各朋友有较大好处. using System;using System.Data;using S ...

  8. Jquery取得iframe中元素的几种方法(转载)

    iframe在复合文档中经常用到,利用jquery操作iframe可以大幅提高效率,这里收集一些基本操作 DOM方法:父窗口操作IFRAME:window.frames["iframeSon ...

  9. js 跨域 Jquery取得iframe中元素的几种方法

    http://www.jb51.net/article/34942.htm 收集利用Jquery取得iframe中元素的几种方法 : 父页面访问子页面 $(document.getElementByI ...

随机推荐

  1. 使用easyui-layout布局

    <body class="easyui-layout"> <div data-options="region:'north',title:'顶部',sp ...

  2. SSISDB3:Environments 和 Environment Variables

    Environment 是ETL执行时使用的Parameters的集合,可以为一个Project引用不同的Environment variables,从而改变ETL执行的属性. 查看Environme ...

  3. 深入理解javascript中的富文本编辑

    前面的话 一说起富文本,人们第一印象就是像使用word一样,在网页上操作文档.实际上差不多就是这样.富文本编辑,又称为WYSIWYG (What You See Is What You Get所见即所 ...

  4. 一起学微软Power BI系列-官方文档-入门指南(2)获取源数据

    我们在文章: 一起学微软Power BI系列-官方文档-入门指南(1)Power BI初步介绍中,我们介绍了官方入门文档的第一章.今天继续给大家介绍官方文档中,如何获取数据源的相关内容.虽然是英文,但 ...

  5. 前端工程优化:javascript的优化小结

     我觉得优化javascript是一门高深的学问,在这里也只能站在前人的肩膀上,说一些我浅显的认识,更希望的是抛钻引玉,如有不对,敬请斧正. 首先,要认识到是,优化js的关键之处在于,优化它的运行速度 ...

  6. git与svn, tfs等源代码管理器的协同

    简单地说,这三个都是业界知名的源代码管理器.他们是有区别的,根本的区别在于git是分布式源代码管理器(每个本地都有完整的代码,及历史),而svn和tfs是集中式源代码管理器(只有服务器才有完整的历史, ...

  7. Linux笔记之——Linux关机命令详解(转)

    原文连接:http://www.jb51.net/os/RedHat/1334.html 在linux下一些常用的关机/重启命令有shutdown.halt.reboot.及init,它们都可以达到重 ...

  8. Deadlock Detecting--转

    /* Java Threads, 3rd Edition By Scott Oaks, Henry Wong 3rd Edition September 2004 ISBN: 0-596-00782- ...

  9. String的按值传递,java传参都是传值

    java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? String和int参数传递是按值传递还是引用传递? 一道面试题目,String的传递: public String change( ...

  10. 使用AutoMapper进行对象间映射

    在开发过程中,难免遇到下面这种情况:两个(或多个)对象所拥有的大多数属性是重复的,我们需要在对象间进行映射(即将一个对象的属性值赋给另一个对象.通常我们可以进行如下操作: A a=new A(); a ...