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

相关文章

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

MySQL 事务的概念及ACID属性和使用详解

《MySQL事务的概念及ACID属性和使用详解》MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性,下面通过本文给大家介绍MySQL事务的概念及ACID属性和... 目录一、什么是事务二、事务的属性及使用2.1 事务的 ACID 属性2.2 为什么存在事务2.3 事务

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

基于.NET编写工具类解决JSON乱码问题

《基于.NET编写工具类解决JSON乱码问题》在开发过程中,我们经常会遇到JSON数据处理的问题,尤其是在数据传输和解析过程中,很容易出现编码错误导致的乱码问题,下面我们就来编写一个.NET工具类来解... 目录问题背景核心原理工具类实现使用示例总结在开发过程中,我们经常会遇到jsON数据处理的问题,尤其是

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节