MVC 模式可将应用程序的模型(数据)逻辑与其呈现逻辑和业务逻辑分离。 在 ASP.NET MVC 中,这种逻辑分离还在项目结构中以物理方式实现,在该项目结构中,控制器和视图保存在使用命名约定定义关系的文件夹中。 此结构可满足大多数 Web 应用程序的需求。

但是,一些应用程序可能具有大量控制器,而每个控制器又可能与若干个视图关联。 对于这些类型的应用程序,默认的 ASP.NET MVC 项目结构可能不实用。

为了满足大型项目的需要,ASP.NET MVC 允许您将 Web 应用程序划分为较小单元(也称为“区域”)。 通过使用区域,可以将大型 MVC Web 应用程序分成较小的功能分组。 区域实际上是应用程序内部的一个 MVC 结构。 一个应用程序可能包含若干个 MVC 结构(区域)。

例如,一个大型电子商务应用程序可能分为若干个区域,这些区域表示店面、产品检查、用户帐户管理和采购系统。 每个区域表示整个应用程序的一个独立功能。

本演练演示如何在 ASP.NET MVC 应用程序中实现区域。 本演练创建一个具有以下区域的博客网站的功能框架:

  • 主。 这是 Web 应用程序的入口点。 此区域包括登录页面和登录功能。

  • 博客。 此区域用于显示博客文章并搜索存档。

  • 面板。 此区域用于创建和编辑博客文章。

为了使本课程简单起见,这些区域不包含用于执行博客的实际任务的逻辑。

创建应用程序结构

若要开始,您将创建一个 ASP.NET MVC 项目,并为两个子区域(博客和面板)添加文件夹结构。

创建应用程序结构

  1. 在 Visual Studio 中,在“文件”菜单上,单击“新建项目”。

  2. 在“项目类型”窗口中,展开“Visual Basic”节点或“Visual C#”节点,然后选择“Web”节点。

  3. 在“模板”窗口中,选择“ASP.NET MVC 2 Web 应用程序”。

  4. 将项目命名为“MvcAreasApplication”,设置项目位置,然后选择“创建解决方案的目录”复选框。

  5. 单击“确定”。

  6. 在“解决方案资源管理器”中,右击项目名称,单击“添加”,然后单击“区域”。

  7. 在“区域名称”中键入 Blog,然后单击“添加”。

    将“区域”文件夹添加到项目。 “区域”文件夹包含一个文件夹结构,其中允许每个子区域具有自己的模型、视图和控制器。

  8. 在“解决方案资源管理器”中,右击项目名称,单击“添加”,然后单击“区域”。

  9. 在“区域名称”中输入 Dashboard,然后单击“添加”。

    完成此操作后,“区域”文件夹将包含两个子文件夹(“Blog”和“Dashboard”)。

注册区域路由

为项目添加区域时,将在 AreaRegistration 文件中定义区域的路由。 该路由会基于请求 URL 将请求发送到相应的区域。 若要注册区域的路由,请在 Global.asax 文件中添加到可自动在 AreaRegistration 文件中查找区域路由的代码。

注册区域路由

  1. 在“解决方案资源管理器”中,打开项目的 Global.asax 文件。

  2. 在 Application_Start 方法中插入以下代码:

     
    AreaRegistration.RegisterAllAreas();

    此代码为每个子区域调用路由注册方法。

在区域之间进行连接

在 ASP.NET MVC 区域应用程序中,可以按照在任何 MVC 应用程序中的做法来在一个区域内进行链接。 例如,可以调用 ActionLink 方法,或者可以调用采用控制器或操作名称的任何其他例程(例如 RedirectToAction 方法)。

但是,若要生成到不同区域的链接,您必须用这些方法的 routeValues 参数显式传递目标区域名称。 例如,下面的标记演示了与 BlogController 类的ShowBlog 操作方法的链接。 此调用不会标识特定的区域。

<%= Html.ActionLink("Show Blog", "ShowBlog", "Blog") %>

在 Blog 区域中的任何地方,此链接都会按照预期方式发挥作用。 但是,如果将上述链接添加到 Dashboard 区域内的视图中,则该链接将失败。 这是因为 ASP.NET MVC 框架在 Dashboard 区域中将无法找到 BlogController 类。

下面的示例演示了如何创建一个链接,该链接标识用 routeValues 参数传递的匿名对象中的区域。 此处显示的示例只作说明之用。 不要将该文件添加到项目中。

<%= Html.ActionLink("Show Blog", "ShowBlog", "Blog", new { area = "blog" }, null) %>
Razor视图语法:
    <p>
@Html.ActionLink("Blog首页", "BlogIndex", "Blog")
</p>
<p>
@*连接到指定区域的controller*@
@Html.ActionLink("Blog首页带参数", "BlogIndex", "Blog", new { number = }, null)
</p>
<p>
@*连接到指定区域的controller下的action*@
@Html.ActionLink("Blog展示页面", "Show", "BlogIndex", new { area = "Blog" }, null)
</p>

注意

最后的 null 参数(在 Visual Basic 中为 Nothing)是必需的,这只是因为具有 routeValues 参数的 ActionLink 方法重载也具有 htmlAttributes 参数。 但是,若只是为了能在区域之间进行链接,则无需此参数。

向主项目添加内容

当您为本演练创建 Visual Studio 解决方案时,解决方案模板包括一个充当应用程序的入口点的主视图。 在本节的演练中,您将向主视图添加到链接到子区域的选项卡。 您还将添加代码以显示诊断信息,包括控制器的名称、操作方法和生成当前视图的区域。

向主项目添加内容

  1. 打开主视图 (Views\Shared\Site.Master)。

  2. 紧接在 <asp:ContentPlaceHolder ID="MainContent" runat="server" /> 元素之后插入以下代码。

    <p>
    Controller: <%= ViewContext.RouteData.Values["controller"] %><br />
    Action: <%= ViewContext.RouteData.Values["action"] %><br />
    Area: <%= ViewContext.RouteData.DataTokens["area"] %>
    </p>

    此代码将向视图添加诊断信息。

  3. 在相同文件中,找到 <ul id="menu"> 元素,然后用以下代码替换整个元素:

    <ul id="menu">
    <li><%= Html.ActionLink("Home", "Index", "Home", new { area = "" }, null)%></li>
    <li><%= Html.ActionLink("Blog", "ShowRecent", "Blog", new { area = "blog" }, null)%></li>
    <li><%= Html.ActionLink("Dashboard", "AddPost", "Dashboard", new { area = "dashboard" }, null)%></li>
    <li><%= Html.ActionLink("About", "About", "Home", new { area = "" }, null)%></li>
    </ul>

    此代码将添加跨区域进行链接的选项卡。

使用区域组织 ASP.NET MVC 应用程序的更多相关文章

  1. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序创建更复杂的数据模型

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第六篇:为ASP.NET MVC应用程序 ...

  2. 为ASP.NET MVC应用程序创建更复杂的数据模型

    为ASP.NET MVC应用程序创建更复杂的数据模型 2014-05-07 18:27 by Bce, 282 阅读, 1 评论, 收藏, 编辑 这是微软官方教程Getting Started wit ...

  3. 使用Metrics.NET 构建 ASP.NET MVC 应用程序的性能指标

    通常我们需要监测ASP.NET MVC 或 Web API 的应用程序的性能时,通常采用的是自定义性能计数器,性能计数器会引发无休止的运维问题(损坏的计数器.权限问题等).这篇文章向你介绍一个新的替代 ...

  4. asp.net MVC 应用程序的生命周期

    下面这篇文章总结了 asp.net MVC 框架程序的生命周期.觉得写得不错,故转载一下. 转载自:http://www.cnblogs.com/yplong/p/5582576.html       ...

  5. 学习ASP.NET MVC(一)——我的第一个ASP.NET MVC应用程序

    学习ASP.NET MVC系列: 学习ASP.NET MVC(一)——我的第一个ASP.NET MVC应用程序 学习ASP.NET MVC(二)——我的第一个ASP.NET MVC 控制器 学习ASP ...

  6. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序读取相关数据

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第七篇:为ASP.NET MVC应用程序 ...

  7. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序更新相关数据

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第八篇:为ASP.NET MVC应用程序 ...

  8. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序使用异步及存储过程

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第九篇:为ASP.NET MVC应用程序 ...

  9. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序处理并发

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第十篇:为ASP.NET MVC应用程序 ...

随机推荐

  1. Swift缩水版MJExtension - Reflect的基本使用

    github:https://github.com/CharlinFeng/Reflect 直接拖拽Reflect文件夹到您的项目中即可,无任何第三方依赖!文件夹结构说明:.Coding 归档相关.R ...

  2. ZOJ3558 How Many Sets III(公式题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud How Many Sets III Time Limit: 2 Seconds   ...

  3. web标准(复习)--8

    今天我们开始学习下拉及多级弹出菜单,包含以下内容和知识点: 带下拉子菜单的导航菜单 绝对定位和浮动的区别和运用 css自适应宽度滑动门菜单 一.带下拉子菜单的导航菜单下拉菜单在一些企业网站应用尤为广泛 ...

  4. 14--物理引擎Box2D

    物理模拟引擎专注于模拟现实世界中物体以及物体之间的基本运动规律.在游戏中引入物理引擎能提高游戏的真实性和可玩性,如<愤怒的小鸟>中小鸟弹出的抛物线运动.<割绳子>中割后的运动等 ...

  5. Symfony2之创建一个简单的web应用

    Symfony2——创建bundle       bundle就像插件或者一个功能齐全的应用,我们在应用层上开发的应用的所有代码,包括:PHP文件.配置文件.图片.css文件.js文件等都会包含在bu ...

  6. Sql数据保存到Excel文件中

    public string ExportExcel( DataSet ds,string saveFileName) { try { if (ds == null) return "数据库为 ...

  7. Activiti工作流学习-----基于5.19.0版本(2)

    二.activiti.cfg.xml的其他bean节点配置 2.1 新特性:Job Executor和Async Executor 从5.17.0版本的activiti开始提供作业执行者(Job Ex ...

  8. Spark学习笔记-使用Spark History Server

    在运行Spark应用程序的时候,driver会提供一个webUI给出应用程序的运行信息,但是该webUI随着应用程序的完成而关闭端口,也就是 说,Spark应用程序运行完后,将无法查看应用程序的历史记 ...

  9. 文件锁及其实例,底层文件I/O操作,基本文件操作和实例,Linux中文件及文件描述符概述

    http://blog.csdn.net/rl529014/article/details/51336161 http://blog.csdn.net/rl529014/article/details ...

  10. 单元测试之C/C++

    如今TDD很火,我公司小,一般写代码不写测试用例的,一般就是随便测试下函数的输入输出,没用工具或框架来测试,非常简单,一点也不正规化. 在一种传统的结构化编程语言中,比如C,要进行测试的单元一般是函数 ...