`

[ASP.NET MVC ]08 - Area 使用

 
阅读更多

ASP.NET MVC允许使用 Area(区域)来组织Web应用程序,每个Area代表应用程序的不同功能模块。这对于大的工程非常有用,Area 使每个功能模块都有各自的文件夹, 文件夹中有自己的Controller、View和Model,但对于管理也增加了一定的难度。

本文目录

创建Area

右键工程选择 添加->区域,弹出如下填写Area的对话框:

点击添加后,工程目录结构如下:

和创建一个空MVC工程结构类似,Admin Area 有自己的 Controllers、Models 和 Views 文件夹,不一样的地方就是多了一个 AdminAreaRegistration.cs 文件,这个文件中定义了一个叫 AdminAreaRegistration 的类,它的内容如下:

namespace MvcApplication1.Areas.Admin {
    public class AdminAreaRegistration : AreaRegistration {
        public override string AreaName {
            get {
                return "Admin";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context) {
            context.MapRoute(
                "Admin_default",
                "Admin/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

系统自动生成的 AdminAreaRegistration 类继承至抽象类 AreaRegistration,并重写了 AreaName 属性和 RegisterArea 方法。在 RegisterArea 方法中它为我们定义了一个默认路由,我们也可在这个方法中定义专属于Admin Area的的其他路由。但有一点要注意,在这如果要给路由起名字,一定要 确保它和整个应用程序不一样。

AreaRegistrationContext 类的 MapRoute 方法和 RouteCollection 类的 MapRoute 方法的使用是一样的,只是 AreaRegistrationContext 类限制了注册的路由只会去匹配当前 Area 的 controller,所以,如果你把在 Area 中添加的 controller 的默认命名空间改了,路由系统将找不到这个controller 。

RegisterArea 方法不需要我们手动去调用,在 Global.asax 中的 Application_Start 方法已经有下面这样一句代码为我们做好了这件事:

protected void Application_Start() {
    AreaRegistration.RegisterAllAreas();

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

调用 AreaRegistration.RegisterAllAreas 方法让MVC应用程序在启动后会寻找所有继承自 AreaRegistration 的类,并为每个这样的类调用它们的 RegisterArea 方法。

注意:不要轻易改变 Application_Start 中注册方法的顺序,如果你把RouteConfig.RegisterRoutes方法放到 AreaRegistration.RegisterAllAreas方法之前,Area 路由的注册将会在路由注册之后,路由系统是按顺序来匹配的,所以这样做会让请求 Area 的 Controller 匹配到错误的路由。

Area的运行

在Area中添加controller、view和model和一般的添加是一样的。在这,我们在Admin Area中添加一个名为 Home 的controller,代码如下:

public class HomeController : Controller {
        
    public ActionResult Index() {
        return View();
    }
}

然后我们再为Index Acton添加一个View,代码如下:

@{ 
    ViewBag.Title = "Index";
    Layout = null; 
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div>
        <h2>Admin Area Index</h2>
    </div>
</body>
</html>

运行应用程序,然后将URL定位到/Admin/Home/Index,下面是运行结果:

到这,我们已经看到,Area中的的工作流程其实就是和根目录下的流程是一样的。但Area并不是一个完全独立的工作空间,我们下面来看看。

Controller的歧义问题

试想一下,如果我们现在在根目录的 Controller 文件夹中也添加一个名为 Home 的 Controller,然后我们通过把URL定位到 /Home/Index,路由系统能匹配到根目录下的 Controller 吗?

在根目录的 Controllers 文件夹中添加好 HomeController 后,为Index添加View,内容随意:

...
<body>
    <div>
        <h2>Root Index</h2>
    </div>
</body>
...

路由不改动,我们使用 RouteConfig.cs 文件中系统定义的默认路由:

public static void RegisterRoutes(RouteCollection routes) {
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

运行程序,将URL定位到 /Home/Index。结果我们会看到如下错误信息:

出现这个问题是因为路由系统进行匹配的时候出现了Controller同名的歧义。

当Area被注册的时候,Area中定义的路由被限制了只寻找 Area 中的Controller,所以我们请求 /Admin/Home/Index 时能正常得到 MvcApplication1.Areas.Admin.Controllers 命名空间的 HomeController。然而我们在RouteConfig.cs文件的RegisterRoutes方法中定义的路由并没有类似的限 制。

为了解决这个问题,我们需要在RouteConfig.cs文件中定义的路由中加上对应的 namespaces 参数。RouteConfig.cs 中修改后的路由如下:

public static void RegisterRoutes(RouteCollection routes) {
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
        namespaces: new[] { "MvcApplication1.Controllers" }
    );
}

运行程序,如下结果说明解决了同名歧义问题:

添加了 namespaces 参数后,路由系统在对这个路由进行匹配时,优先匹配指定命名空间的controller,如果匹配到则即刻停止查找,如果在指定的命名空间下没有匹配到对应的controller,再按照一般的方式进行匹配。

生成Area URL链接

关于Area的URL链接生成,可以分为这么三种情况:第一种是在当前Area生成指向当前Area的链接;第二种是生成指向其他Area的链接;第三种是在某个Area中生成指向根目录的链接。下面是这三种情况生成链接的方法,使用的路由定义是系统默认的。

如果要在Area中生成当前Area的URL链接,直接用下面的方法就行:

@Html.ActionLink("Click me", "About")

它根据当前所在的Area和Controller会生成如下Html代码:

<a href="/Admin/Home/About">Click me</a>

如果要生成其他Area的URL链接,则需要在Html.ActionLink方法的匿名参数中使用一个名为area的变量来指定要生成链接的Area名称,如下:

@Html.ActionLink("Click me to go to another area", "Index", new { area = "Support" }) 

它会根据被指定的Area去找路由的定义,假定在Support Area中定义了对应的路由,那么它会生成如下链接:

<a href="/Support/Home/Index">Click me to go to another area</a>

如果要在当前Area生成指根目录某个controller的链接,那么只要把area变量置成空字符串就行,如下:

@Html.ActionLink("Click me to go to top-level part", "Index", new { area = "" })

它会生成如下Html链接:

<a href="/Home/Index">Click me to go to top-level part</a>
分享到:
评论

相关推荐

    ASP.NET MVC 项目集合.zip

    7. ** Areas**: 大型项目中,ASP.NET MVC通过Areas来组织和管理相关的功能模块,每个Area可以看作是一个独立的小型Web应用,拥有自己的控制器、视图和模型。 8. **依赖注入(Dependency Injection, DI)**: ASP.NET...

    ASP.NET MVC开发实战超完整源码

    8. **数据验证(Data Validation)**:ASP.NET MVC支持客户端和服务器端的数据验证,可以使用数据注解(Data Annotations)来定义验证规则,确保输入的有效性。 9. **辅助方法(Html Helper Methods)**:这些方法...

    asp.net mvc5源码下载.rar

    ASP.NET MVC5是一个开源的Web应用程序框架,由微软开发,用于构建动态、数据驱动的Web应用。这个框架基于模型-视图-控制器(MVC)设计模式,它为开发者提供了强大的设计工具,使得构建可测试、可维护的Web应用变得...

    微软开源ASP.NET MVC项目

    9. ** Areas**:对于大型应用,ASP.NET MVC提供了Area特性,可以将应用划分为多个独立的区域,管理复杂的应用结构。 10. **AJAX集成**:MVC框架内置对jQuery的支持,可以方便地实现部分页面更新和异步操作。 通过...

    Asp.net Mvc 关于area的一个小模型

    在Asp.NET MVC中,Area可以视为一个独立的MVC应用,它可以有自己的控制器、视图和模型,这样在一个大型项目中,可以根据功能模块划分不同的Area,每个Area负责一部分功能,提高了代码的可读性和可维护性。...

    asp.net mvc handler

    在ASP.NET MVC中,你可以使用Entity Framework等ORM工具来简化数据操作。 2. **视图(View)**: 视图是用户看到并与其交互的页面。它通常由Razor语法编写,用于呈现由Controller传递的数据。视图的职责是展示数据,...

    ASP.NET MVC 5高级编程 高清 带目录PDF(不含源代码)

    6. **AJAX集成**:ASP.NET MVC 5支持使用jQuery和其他AJAX库,以实现页面无刷新更新,提高用户体验。 7. **单元测试与持续集成**:书中可能会讨论如何编写测试驱动的代码,以及如何集成持续集成工具,如Team ...

    asp.net mvc chart(MVC 使用chart图表控件的示例)

    在ASP.NET MVC中,我们可以使用Chart控件来创建各种类型的图表,包括折线图、柱状图、饼图等,以便于数据可视化。这个示例将深入探讨如何在MVC应用中集成和使用Chart控件。 首先,我们需要在项目中添加对`System....

    Asp.net MVC示例源码

    **Asp.net MVC 示例源码详解** Asp.net MVC 是微软提供的一种用于构建动态网站、Web 应用程序和Web API的开源框架。它遵循Model-View-Controller(MVC)设计模式,使得开发者能够更好地实现业务逻辑与界面展示的...

    asp.net mvc源码

    如果一个大型项目需要组织成多个模块,ASP.NET MVC中的Areas可以帮助划分各个功能区域,每个Area都像一个独立的MVC应用程序。 8. **强类型视图和辅助方法**: 强类型视图允许直接使用Model的属性,提高了代码的...

    黄宝翕-ASP.NET MVC4开发指南

    高清扫描版的《ASP.NET MVC4开发指南》(黄保翕著),比较偏重理论,知识深度较浅,适合初学MVC的同学阅读。 1.在学习ASP.NETMVC之前 2.创建正确的开发观念 3.新手上路初体验 4.Routing与ASP.NET生命周期 5.Model相关...

    asp.net MVC 源码

    ASP.NET MVC 是微软开发的一个用于构建可测试和可维护的Web应用程序的框架,它基于Model-View-Controller(MVC)设计模式。该框架提供了一种分离关注点的方式,允许开发者将业务逻辑、数据访问和用户界面分别处理,...

    ASP.NET MVC3.0 高级编程完整版

    3. **Entity Framework**:在ASP.NET MVC3.0中,通常会使用Entity Framework作为默认的数据访问层。这是一个ORM(对象关系映射)工具,允许开发者用面向对象的方式来操作数据库,减少了对SQL的直接依赖。 4. ** ...

    ASP.NET MVC4 Web 编程 中文完整版pdf

    通过阅读这个中文完整版PDF,读者不仅可以学习到ASP.NET MVC4的基本概念和技术,还能掌握如何使用这些技术来构建实际的Web应用,从而提升自己的开发技能。无论是初学者还是有经验的开发者,都能从中受益。

    ASP.NET MVC4 安装包(包含中文语言包)

    "AspNetMVC4Setup.exe"是ASP.NET MVC4的主要安装程序,它将为你的开发环境添加必要的运行时库、工具和API,使你能创建和运行使用ASP.NET MVC4技术的Web应用。这个安装包通常包括以下组件: 1. ASP.NET MVC4 ...

    Asp.net MVC框架.rar

    6. ** Areas**:对于大型应用,ASP.NET MVC提供Areas功能,帮助组织多个相关的功能模块,每个Area都像一个独立的小型MVC应用。 7. **测试支持**:由于MVC架构的解耦特性,单元测试和集成测试变得更容易。可以对控制...

    使用ASP.NET MVC开发企业级应用网站源码及数据库

    该项目使用ASP.NET MVC,意味着它可能包含了以下组件和技术: - **路由**:ASP.NET MVC的URL路由机制使得URL更具有描述性,易于SEO优化。 - ** Areas**:如果项目复杂度较高,可能会使用Areas来组织功能模块,每个...

    《ASP.NET MVC4 Web编程》完整版PDF

    本教程针对初学者,将深入介绍如何使用ASP.NET MVC4进行Web编程。 ### 一、MVC设计模式 1. **模型(Model)**:代表应用的数据和业务逻辑。模型对象负责与数据库或其他数据源交互,处理业务规则和数据验证。 2. *...

    asp.net-mvc

    ASP.NET MVC使用路由系统来解析URL并调用相应的控制器和动作方法。开发者可以自定义路由规则,使URL更加语义化,提高用户体验。 **测试驱动开发(TDD)**: ASP.NET MVC鼓励采用TDD,这意味着在编写代码之前先编写...

    ASP.NET MVC 5高级编程 源码

    ASP.NET MVC 5是微软开发的一个用于构建动态网站的开源框架,它基于模型-视图-控制器(MVC)设计模式,提供了强大的功能和灵活性,适用于Web应用开发。本资源包含的是ASP.NET MVC 5的高级编程源码,旨在帮助开发者...

Global site tag (gtag.js) - Google Analytics