`
spark_li
  • 浏览: 20800 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

源码分析——在ASP.Net MVC 中,如何在Global.asax中配置一个指向Area内部的默认Route

 
阅读更多

ASP.Net MVC 中配置Route的时候可以设置一个默认的Route。比如我要在输入http://localhost的时候默认进入http://localhost/home/index。可以在Global.asax中这么配置:

 

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );
很简单,对吧。

 

但是如果你想把默认值指向一个Area内部的Controller/Action,要怎么做呢? 

模仿上面的例子,我是这么做的:

新建一个叫做MyArea的area,然后配置路由如下:

 

 

            routes.MapRoute(
                "Default", // Route name
                "{area}{controller}/{action}/{id}", // URL with parameters
                new {area = "MyArea", controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );
添加了一个area的section,应该可以了吧。

 

运行一下看看:

结果是Controller冲突,截图如下:



 

这说明了我们配置的那个{Area}没起作用。原来MVC的route没有对Area进行支持。

来看看MyAreaAreaRegistration的源码中是怎么做的:

        public Route MapRoute(string name, string url, object defaults, object constraints, string[] namespaces) {
            if (namespaces == null && Namespaces != null) {
                namespaces = Namespaces.ToArray();
            }

            Route route = Routes.MapRoute(name, url, defaults, constraints, namespaces);
            route.DataTokens["area"] = AreaName;

            // disabling the namespace lookup fallback mechanism keeps this areas from accidentally picking up
            // controllers belonging to other areas
            bool useNamespaceFallback = (namespaces == null || namespaces.Length == 0);
            route.DataTokens["UseNamespaceFallback"] = useNamespaceFallback;

            return route;
        }

 它在MapRoute的时候加入了一个namespace的约束。那我们也来加上看看。

     routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new {controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
                new[] { "WebArchDemo.Areas.MyArea.*" }  
            );

 OK,成功了。不过仔细一看。View不对了。它竟然还是去找Area外面的View,而不是这个Area下面的View.

 我们在ViewEngine的源码中找一下原因,关键代码是在寻找View时的下面几句:

string areaName = AreaHelpers.GetAreaName(controllerContext.RouteData);
bool usingAreas = !String.IsNullOrEmpty(areaName);
List<ViewLocation> viewLocations = GetViewLocations(locations, (usingAreas) ? areaLocations : null);

 ViewEngine会在controllerContext.RouteData中去找AreaName,如果找到的话就用Area中的View,否则用根目录下的View.那这个AreaName是什么时候放如RouteData中的呢?

回头看一下我前面贴出来那段MyAreaAreaRegistration中的源码,关键的一句就是:

route.DataTokens["area"] = AreaName;

就是在注册Area的Route的时候,会把这个AreaName放进去。

 

明白了这一点,我们就可以来继续改造我们注册route的地方:

          var route =   routes.MapRoute(
                                "Default", // Route name
                                "{controller}/{action}/{id}", // URL with parameters
                                new {controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
                                new[] { "WebArchDemo.Areas.MyArea.*" }  
                            );

 route.DataTokens["area"] = "MyArea";

测试一下,完全正确。

 

在实际的项目中,可能直接把默认route指向Area内部的一个Action的几率比较小。不过还是有一些特殊场景。

我们通过尝试来实现这么一种特殊场景,分析了AreaRegistration的工作原理,也窥探了一下Route和ViewEngine是如何处理Area的。

我们可以看到,MVC在尽可能少地侵入框架的情况下,实现了一套Area机制。

 

  • 大小: 86.2 KB
分享到:
评论

相关推荐

    ASP.NET源码——通用防SQL注入漏洞程序(Global.asax方式).zip

    在ASP.NET中,Global.asax文件是一个特殊的应用程序全局事件处理程序,它允许开发者捕获和响应应用程序级别的事件,如请求开始、结束等。这个压缩包提供的源码是针对ASP.NET应用的通用防SQL注入漏洞程序,通过Global...

    asp.net mvc 示例项目

    在ASP.NET MVC中,视图通常与一个特定的控制器动作关联,用于显示该动作返回的数据。 3. **控制器(Controller)**:控制器处理用户的请求,调用模型进行业务处理,并选择合适的视图来展示结果。控制器是模型和视图...

    Asp.net mvc blog 小程序源码.rar

    在`Global.asax.cs`文件中,我们可以看到定义了默认路由规则,如`{controller}/{action}/{id}`,使得URL如`/Post/Details/1`能被正确解析。 7. **视图助手(View Helpers)**:在视图中,可能用到了一些视图助手,...

    ASP.NET源码——达达ASP.NET企业信息管理系统.zip

    这个"ASP.NET源码——达达ASP.NET企业信息管理系统.zip"文件包含了一个完整的ASP.NET应用实例,专为企业信息管理设计。下面我们将深入探讨这个系统可能涉及的关键知识点。 1. **ASP.NET MVC框架**:ASP.NET MVC...

    ASP.NET MVC+EF+EasyUI权限管理源码

    这些文件夹分别对应了MVC架构中的各个部分,其中`Global.asax`是ASP.NET应用的全局启动文件,负责注册路由和其他全局配置。`Views\Shared\Error.aspx`可能是错误处理页面,确保在出现异常时向用户提供友好的错误信息...

    Asp.net Mvc官方源代码

    ASP.NET MVC是一个开源的Web应用程序框架,由微软公司开发并维护,用于构建可维护、高性能的Web应用。这个框架基于模型-视图-控制器(MVC)设计模式,提供了清晰的分离关注点,使得开发者能够更高效地进行开发。本文...

    asp.net mvc2.0 开发的一个小项目

    在这个小项目中,我们可以看到一个典型的ASP.NET MVC2.0应用的实现,它可能包含路由配置、控制器、视图、模型以及数据库交互等多个组成部分。 1. **MVC模式**:MVC是一种设计模式,将业务逻辑(Model)、用户界面...

    Asp.net MVC示例源码

    在`Global.asax.cs`文件中,Asp.net MVC的路由配置通常在`RegisterRoutes(RouteCollection routes)`方法中进行。这里的路由规则定义了URL与控制器方法之间的映射,使得系统可以根据URL自动调用相应的控制器和动作。...

    asp.net mvc5 源码

    过滤器是ASP.NET MVC5中的一个强大特性,允许在执行控制器操作之前或之后执行代码,如认证、授权、异常处理和日志记录。过滤器可以全局应用,也可以针对特定控制器或操作进行设置。 **五、模型绑定和验证** 模型...

    基于ASP.NET MVC 2 的小程序

    在ASP.NET MVC 2 中,控制器类继承自System.Web.Mvc.Controller基类,每个操作方法返回一个ActionResult对象,该对象指示视图如何呈现。例如,你可能会返回一个ViewResult来渲染视图,或者一个JsonResult来返回JSON...

    ASP.NET MVC4源码

    路由配置在`Global.asax.cs`文件的`RegisterRoutes`方法中完成。 5. ** Areas(区域)**:大型项目中,ASP.NET MVC4引入了区域概念,可以将功能相关的控制器和视图组织成独立的模块,帮助保持代码的整洁和模块化。 ...

    asp.Net mvc4 实例

    6. ** Areas**:ASP.NET MVC4引入了区域(Areas)的概念,允许在一个大型项目中组织多个相互独立的功能模块,每个区域都有自己的控制器、视图和模型,类似于小型的MVC应用程序。 7. **AJAX支持**:ASP.NET MVC4内置...

    ASP.net全局程序文件Global.asax用法分析

    Global.asax文件是***应用程序中非常重要的一个组成部分,它能够帮助开发者在应用程序级别上更好地管理和响应各种事件。正确地使用Global.asax文件中的事件可以极大地增强应用程序的功能性和响应性。在实际开发中,...

    ASP.NET MVC2源码

    在`Global.asax.cs`文件中,你可以找到`RegisterRoutes`方法,这里配置了应用的默认路由规则。 - **控制器(ControllerBase/Controller)**:控制器类是处理用户请求的基础。ASP.NET MVC2提供了`Controller`基类,...

    ASP.NET源码——[博客空间]Asp.net mvc blog 小博客程序源码.zip

    在`Global.asax.cs`文件中,开发者可以定义默认路由规则,比如`/Blog/Details/{id}`对应`BlogController`的`Details`动作。 5. **数据库交互** 博客系统通常需要与数据库进行交互,存储和检索文章数据。ASP.NET ...

    Asp.net MVC 3实例学习之ExtShop系列最终源代码

    通过研究这个项目的源代码,我们可以深入理解MVC模式在实际项目中的应用,以及Asp.net MVC 3框架的内部工作原理。 1. **模型(Model)**:在MVC模式中,模型负责处理业务逻辑和数据管理。在ExtShop中,模型类通常与...

    ASP.NET源码——[论坛社区]ASP.NET MVC BBS 简易Demo教学版.zip

    这个压缩包包含了一个基于ASP.NET MVC 1.0版本的论坛系统源码,旨在帮助开发者理解如何在实际开发中运用MVC设计模式。 首先,ASP.NET MVC是一个微软提供的开源Web应用程序框架,它允许开发者使用模型(Model)、...

    ASP.NET 3.5 MVC 架构与实战源码.rar

    在压缩包"ASP.NET+3.5+MVC+架构与实战"中,包含了该书的源码,读者可以结合书中的内容,动手实践每个示例,加深对ASP.NET MVC的理解和应用能力。这本书的内容涵盖了从基础概念到高级特性的全面教程,对于初学者和有...

    Manning.ASP.NET.MVC2.in.Action

    在Global.asax文件中,开发者可以定义默认路由或自定义路由规则,以控制URL结构。 5. **模型绑定(Model Binding)**:模型绑定自动将HTTP请求数据映射到控制器方法的参数,简化了数据接收过程。ASP.NET MVC2支持多种...

Global site tag (gtag.js) - Google Analytics