ASP.NET MVC2 Areas区域新概念

2024-03-06 08:38
文章标签 概念 区域 asp net mvc2 areas

本文主要是介绍ASP.NET MVC2 Areas区域新概念,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文转自:http://www.systhinker.com/html/89/n-18889.html

为了方便大规模网站中的管理大量文件,ASP.NET MVC 2.0版本中引入了一个新概念—区段(Area)。在本文中,我们将讨论与区段概念相关的基本操作。 

  随着对Web应用程序功能需求的日益增长,与特定Web应用程序相关联的文件的数量有可能会急剧增长。在Web窗体应用程序中,网页通常分为若干个子文件夹,每个子文件夹代表这些网页集合中的一个逻辑分组。另一方面,Web表单项目模板有可能使用任意的文件夹结构来进行文件组织。

  ASP.NET MVC按照既定惯例进行管理。因此,对应的文件夹结构比较严格,你甚至可以照搬照抄使用,所有网页都被划分为根文件夹Views下的一些子文件夹,每一个子文件夹与Controllers文件夹中的每个控制器名称相匹配。例如,“Organizations”控制器就在“Views”文件夹下有一个对应的“Organizations”文件夹,所有ASPX网页描述了对应于Organizations控制器的视图。图1给出了一个这样的可能的示例文件夹结构:

1

  图1—示例MVC工程结构

  虽然上述过程可以允许稍微的定制,但是由于约定惯例文件夹结构还是保持比较严格的组织方式。最新版本的MVC 2.0中在上述约定中添加了一个区段(Area)的新概念。这样一来,在严格的ASP.NET MVC框架和逻辑组件分离之间就出现了一种平衡机制。理解这一点最简单的方式就是观察一下一个示例工程的文件夹结构。下面给出的是与前面的图1同一样的项目,但是经过使用内联区段技术进行了重新布局。

1

  图2—使用内联式区段

  内联项目区段允许ASP.NET MVC项目在维持控制器、模型和视图文件夹结构的同时,还对逻辑组件进行相互的分离,但是核心项目实施与Organizations区段是分离开来的。应用程序的区段可以允许出现重复的控制器类命名、模型类名字、视图命名等,但各个区段还可以共享“Shared”文件夹下的资源。

  你可能看到,在上面图1和图2中给出的两个文件夹架构例子中,文件夹架构略微改变了一下。图1中只有一个organization控制器,现在有了一个organization区段,在连接中出现了另一个级别的层次结构。现在,针对/Organizations/Index的请求被路由到/Organizations/Management/Index之下。

  一、路由

  ASP.NET MVC中视图之间使用的默认的路由机制都是按照惯例执行的。例如,在图1中,到Manage行为的链接将会产生下列的行为链接声明,这样会生成一个重定向到主项目中的Organizations控制器的超链接。

  清单1—将目标锁定在Organizations控制器中的Manage视图上

Html.ActionLink("Manage this Organization", "Manage", 
new { controller = "Organizations", key = 1 })

 

  第一个参数指定链接文本,而最后三个参数依次指定要调用的行为方法、行为方法所在的控制器和路由参数,这些参数就像查询字符串一样进行传递(除非在路由中指定参数)。

  区段概念的引入对上述情形进行了一些改变,因为我们需要能够区分希望路由到的区段。要实现这一点是很简单的,我们只需要把一个额外的区段对应的键/值对添加到路由参数列表中。为了路由到如清单2所示的新的内联段中,我们可以使用下面的语法:

  清单2—将目标锁定在Organizations区段上的Management控制器中的Manage视图上

Html.ActionLink( " Manage this Organization " ,  " Manage " ,  " Management " , 
new  { area  =   " Organizations "  key  =   1  })

 

  一个区段目标指定了要导航到的正确区段。不使用这种办法,链接将导航到主项目中的ManagementController控制器,但这个控制器是不存在的。在上面的代码中,我们新增加了area = "Organizations",从而实现把所有请求正确路由到区段范围内的控制器上。

 

但是,要实现这一目标还需要几个步骤—需要使用一个称为AreaRegistration的新的对象。我们需要针对区段使用一个定制的注册过程,如清单3所示。  

       清单3—注册一个区段的代码举例

 

public  class OrganizationsAreaRegistration : AreaRegistration
{
    
public  override  string  AreaName
    {
        
get
        {
            return 
" Organizations " ;
        }
    }
    
public  override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            
" Organizations_default " ,
            
" Organizations/{controller}/{action}/{id} " ,
            
new  { action  =   " Index " , id  =  UrlParameter.Optional }
        );
    }
}

 


  这里,RegisterArea是实现注册的关键组件,通过把另一个路由添加到区段路由集合中实现。请注意,这里的区段名Organizations是以硬编码方式添加到URL中;因此,所有使用此区段名称作为前缀的请求都被进行特别路由处理。  
  你可能感到疑惑:为什么我们不能在主应用程序的路由定义中指定Organizations部分?实际上,如果我们将它加入到标准的路由表中,而不通过区段上下文,那么,我们还是把所有文件驻留到同一个项目中,从而失去了首先分离项目区段的好处(即区段失败了作用)。

  二、多项目区段

  尽管不直接为ASP.NET MVC 2所支持,但是在测试版本的ASP.NET MVC中,仍然支持多项目区段,即通过区段把一个大项目分成多个子项目。一个单独的ASP.NET MVC项目可以被看作是一个区段,其工作方式就像一个嵌入式区段一样。这种方法非常类似于嵌入式工程区段,当然还要在MVC项目中进行一些额外的设置工作。

  上述额外的设置功能需要使用一种技术,即复制项目内容并在主项目中布署它们,主要是把外部项目区与主ASP.NET MVC项目进行合并。借助于ASP.NET MVC未来程序集的一部分,框架会自动地通过一个MSBuild任务为你完成这项工作。有一个称为Microsoft.Web.Mvc.Build.dll的程序集负责执行此过程。

  注意:上述功能不被微软官方所支持。但是,如果你想尝试利用此安装程序的话,下面的资源将有助于你实现定制的项目构建任务:

     •  http://msdn.microsoft.com/en-us/library/ee307987%28VS.100%aspx
  •  http://dotnetslackers.com/articles/aspnet/a-first-look-at-asp-net-mvc-2.aspx

  至于微软方面,到目前为止仅支持单个项目区段。

  三、我的看法

  “区段”概念的引入有助于实现内容的分离,但因为各种各样的原因,我的建议是不要过度使用这一概念。首先,“区段”的引入的确增加了项目范围内的文件的数量。保持尽可能小的项目文件数目将有助于保持应用程序的可维护性。当然我不是反对使用区段技术,只是推荐在项目规模和实现内容逻辑分离之间要保持一个适度的平衡为最好。

  使用区段带来的一个很好的特性是,你可以为视图设置具有类似命名的控制器,从而使得整个网站感觉是一致的。例如,区段accounts,store和catalog可以使用一致的URL,通过给予每一个区段类似命名的控制器和行为来实现。例如,你的网站可以使用如下的组织方式:

 

/ Accounts / Search / Index
/ Store / Search / Index
/ Catalog / Search / Index

 

 

  虽然一致性不是必需的,但是它可以帮助用户更容易地在你的网站中导航—通过使用类似的设置(假定每个视图都提供类似的功能)。

  四、结论

  “区段”概念的引入有助于实现内容的分离,并能够改变路由过程工作的方式。区段有自己的文件夹结构并能够实现把他们自己的控制器要求路由到对应的视图。路由需要使用一个新的区段路由参数,以便路由到正确的区段上。

这篇关于ASP.NET MVC2 Areas区域新概念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/779448

相关文章

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)

计算机网络基础概念 交换机、路由器、网关、TBOX

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、VLAN是什么?二 、交换机三、路由器四、网关五、TBOXTelematics BOX,简称车载T-BOX,车联网系统包含四部分,主机、车载T-BOX、手机APP及后台系统。主机主要用于车内的影音娱乐,以及车辆信息显示;车载T-BOX主要用于和后台系统/手机APP通信,实现手机APP的车辆信息显示与控

01 Docker概念和部署

目录 1.1 Docker 概述 1.1.1 Docker 的优势 1.1.2 镜像 1.1.3 容器 1.1.4 仓库 1.2 安装 Docker 1.2.1 配置和安装依赖环境 1.3镜像操作 1.3.1 搜索镜像 1.3.2 获取镜像 1.3.3 查看镜像 1.3.4 给镜像重命名 1.3.5 存储,载入镜像和删除镜像 1.4 Doecker容器操作 1.4

【机器学习-一-基础概念篇】

机器学习 定义分类算法 应用 定义 机器学习最早是被Arthur Samuel 提出的一个概念,指计算机无需明确编程即可学习的研究领域。1950年他发明的跳棋程序,这个人机对弈游戏让他的声名鹊起,机器学习这个概念才进入大众的是视线。 在这个跳棋程序里,他编程了一种算法,这个程序与Arthur下了数万次跳棋,计算机逐渐学会了下在哪里有更大的可能会赢得比赛,哪里会输,通过这种方法,最

【吊打面试官系列-Redis面试题】说说 Redis 哈希槽的概念?

大家好,我是锋哥。今天分享关于 【说说 Redis 哈希槽的概念?】面试题,希望对大家有帮助; 说说 Redis 哈希槽的概念? Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽, 集群的每个节点负责一部分 hash 槽。

AI辅助编程里的 Atom Group 的概念和使用

背景 在我们实际的开发当中,一个需求往往会涉及到多个文件修改,而需求也往往有相似性。 举个例子,我经常需要在 auto-coder中需要添加命令行参数,通常是这样的: /coding 添加一个新的命令行参数 --chat_model 默认值为空 实际上这个需求涉及到以下文件列表: /Users/allwefantasy/projects/auto-coder/src/autocoder/auto