Mvc系统学习9——Areas学习

  在Mvc2.0中,新增加了一个特性就是Areas。在没有有使用Areas的情况下,我们的Mvc项目组织是下面这样的。当项目庞大的时候,Controllers,Model,View文件下下面势必会有很多文件。项目将难以管理。

      通过使用Areas使我们可以很好的组织项目,通过单机添加Areas(区域),使用Areas来组织项目。可以得到新的项目组织结构。

      First,Second对应着我们项目的子模块(First,Second命名不是很好)。在这两个文件夹下,有各自独立的Controllers,Models,Views。此外还多了个文件AreaRegistration为后缀的.cs文件. 这个文件主要的作用是给Areas下的子模块配置路由。在全局文件Global.asax中的Application_Start事件里有这么一句代码 AreaRegistration.RegisterAllAreas(),通过mvc源码可以发现通过这句代码最后会调用各个AreaRegistration类,实现路由的注册。

//重写了AreaName用于给DataToken["area"]赋值public class FirstAreaRegistration : AreaRegistration{public override string AreaName{get{return "First";}}//这里会添加一个相应的Area名称的前缀,因为下面这样的添加也是作用到全局路由表的.//而且这里的MapRoutes,和在全局的MapRoutes是不同的//这时AreaRegistrationContext里面的方法,它里面的方法会自动给DataToken["area"]键赋值当前的AreaName public override void RegisterArea(AreaRegistrationContext context){context.MapRoute("First_default","First/{controller}/{action}/{id}",new { controller = "Home", action = "Index", id = UrlParameter.Optional });}
View Code

       当调用 AreaRegistration.RegisterAllAreas()时,会最后调用下面这个方法。通过下面的代码可以得出,这个方法会通过反射得出所有的AreaRegistration的Type实例。接下来依次通过Activator创建实例,进而调用CreateContentAndRegister方法。\

internal static void RegisterAllAreas(RouteCollection routes, IBuildManager buildManager, object state) {List<Type> areaRegistrationTypes = TypeCacheUtil.GetFilteredTypesFromAssemblies(_typeCacheName, IsAreaRegistrationType, buildManager);foreach (Type areaRegistrationType in areaRegistrationTypes) {AreaRegistration registration = (AreaRegistration)Activator.CreateInstance(areaRegistrationType);registration.CreateContextAndRegister(routes, state);}}
View Code

       registration.CreateContextAndRegister方法:

internal void CreateContextAndRegister(RouteCollection routes, object state) {//实例化一个AreaRegistrationContext 实例,AreaName已经传递给AreaRegistrationContext了AreaRegistrationContext context = new AreaRegistrationContext(AreaName, routes, state);string thisNamespace = GetType().Namespace;if (thisNamespace != null) {context.Namespaces.Add(thisNamespace + ".*");}//调用注册方法,这个方法在各个AreaRegistration中被重写
             RegisterArea(context);}
View Code

      各个AreaRegistration重写的RegisterArea(context)方法里面通过调用AreaRegistrationContext的Maproute方法来实现注册,这个方法最后的调用方法是下面这个。可以发现下面这个方法也会调用RouteCollection的MapRoute方法,调用这个方法之后,又向route的DataTokens字典的area和UseNamespaceFallback键设置值。这有什么作用?

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 areasbool useNamespaceFallback = (namespaces == null || namespaces.Length == 0);route.DataTokens["UseNamespaceFallback"] = useNamespaceFallback;return route;}
View Code

        还有几个疑问待解决:

        1.Area下的路由过程是怎么样的?
        2.在Area下可以实现不同的Area有相同的ControllerName,可以在全局的Global.ascx进行文件配置,但是如果是同名的Controller则会出现错误,而对没有同名的Controller进行配置则不会,这是为什么?

        比如在First,Second都有HomeController,如果在全局的Global.ascx文件进行配置,下面的配置不会出错,但是如果namespaces是MvcAreaDemo2.Areas.First时则会出现错误。这时为什么?如果没有用同名的Controller则namespace是MvcAreaDemo2.Areas.First和MvcAreaDemo2.Areas.First.Controllers都没有错。

routes.Add(new Route("Index1", new MvcRouteHandler()){Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index", id = UrlParameter.Optional }),DataTokens = new RouteValueDictionary(new { area = "First", namespaces = new[] { "MvcAreaDemo2.Areas.First.Controllers" } })});routes.Add(new Route("Index2", new MvcRouteHandler()){Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index", id = UrlParameter.Optional }),DataTokens = new RouteValueDictionary(new { area = "Second", namespaces = new[] { "MvcAreaDemo2.Areas.Second.Controllers" } })});
View Code

        3.在Area的使用况下,如果要跳转到另外一个Area的页面,则使用Html.ActionLink进行编写似乎更加麻烦了,有木有更加简便的方法?

转载于:https://www.cnblogs.com/fhlj/p/3615244.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天池 在线编程 数组游戏

文章目录1. 题目2. 解题1. 题目 样例 1 输入: [3, 4, 6, 6, 3] 输出: 7 说明: [3, 4, 6, 6, 3] -> [4, 5, 7, 6, 4] -> [5, 6, 7, 7, 5] -> [6, 7, 8, 7, 6] -> [7, 8, 8, 8, 7] -> [8, 9, 9, 8, 8] -> [9, 9, 10, 9, 9] -> [10, 10, 10, 10, 10] 来源&a…

机器学习:sklearn数据集与机器学习组成

机器学习组成&#xff1a;模型、策略、优化 《统计机器学习》中指出&#xff1a;机器学习模型策略算法。其实机器学习可以表示为&#xff1a;Learning RepresentationEvalutionOptimization。我们就可以将这样的表示和李航老师的说法对应起来。机器学习主要是由三部分组成&…

天池 在线编程 分割数组

文章目录1. 题目2. 解题1. 题目 来源&#xff1a;https://tianchi.aliyun.com/oj/164426199705086870/193936950952137407 2. 解题 class Solution { public:/*** param arr: an inter array * return: return the min sum*/int splitArray(vector<int> &arr) {// …

Scikit-learn的分类器算法:k-近邻及案例

k-近邻算法采用测量不同特征值之间的距离来进行分类优点&#xff1a;精度高、对异常值不敏感、无数据输入假定缺点&#xff1a;计算复杂度高、空间复杂度高使用数据范围&#xff1a;数值型和标称型一个例子弄懂k-近邻 电影可以按照题材分类&#xff0c;每个题材又是如何定义的呢…

C++ 添加程序图标到我的电脑

&#xff23;&#xff0b;&#xff0b; 像我的电脑中 百度网盘的 那图标快捷方式。如何生成的呢&#xff1f;设置程序图标到我的电脑 请看下边代码 就ok了(*^__^*) 嘻嘻…… 类似下图&#xff1a; 大家如果看我下边的不是很清楚&#xff0c;可以下载这个具体工程&#xff1b…

struts-tiles学习笔记

网上搜了一些&#xff0c;稀里糊涂的&#xff0c;要么是代码不全&#xff0c;要么是版本不对&#xff0c;还是去struts官网大概学习了一下 http://struts.apache.org/development/1.x/struts-tiles/examples.html转载于:https://www.cnblogs.com/qrlozte/p/3625254.html

Python随机数生成方法

1. random.seed(int) 给随机数对象一个种子值&#xff0c;用于产生随机序列。对于同一个种子值的输入&#xff0c;之后产生的随机数序列也一样。通常是把时间秒数等变化值作为种子值&#xff0c;达到每次运行产生的随机系列都不一样seed() 省略参数&#xff0c;意味着使用当前系…

LeetCode 1663. 具有给定数值的最小字符串(贪心)

文章目录1. 题目2. 解题1. 题目 小写字符 的 数值 是它在字母表中的位置&#xff08;从 1 开始&#xff09;&#xff0c;因此 a 的数值为 1 &#xff0c;b 的数值为 2 &#xff0c;c 的数值为 3 &#xff0c;以此类推。 字符串由若干小写字符组成&#xff0c;字符串的数值 为…

Python算法题----在列表中找到和为s的两个数字

列表data的值为[1, 3, 4, 5, 8, 9, 11]&#xff0c;找出这个列表中和为13的两个数字的所有组合。这个好找&#xff0c;上过幼儿园大班的&#xff0c;估计都能找出来。4913, 5813。如何用python写一个函数来实现呢。 解法一&#xff1a; 超级大循环 最容易想到的就是遍历啊。嵌套…

LeetCode 1664. 生成平衡数组的方案数(前缀和+后缀和)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums 。你需要选择 恰好 一个下标&#xff08;下标从 0 开始&#xff09;并删除对应的元素。请注意剩下元素的下标可能会因为删除操作而发生改变。 比方说&#xff0c;如果 nums [6,1,7,4,1] &#xff0c; 那么&#xff1a; …

sklearn分类器:朴素贝叶斯

朴素贝叶斯朴素贝叶斯&#xff08;Naive Bayes&#xff09;是一个非常简单&#xff0c;但是实用性很强的分类模型。朴素贝叶斯分类器的构造基础是贝叶斯理论。概率论基础概率定义为一件事情发生的可能性。事情发生的概率可以 通过观测数据中的事件发生次数来计算&#xff0c;事…

迪美特TVZ8双核智能高清播放器 在电视上编程不是梦

迪美特TVZ8双核智能高清播放器 两步让普通电视变云电视 独家VST&#xff1a; 全网聚合&#xff0c;极致体验&#xff1a;独家自主设计&#xff0c;炫丽生动的Win8风格UI界面&#xff1a; 新版VST全聚合是华人用户数最多的聚合平台软件&#xff0c;集合视频点播、网络直播…

LeetCode 1665. 完成所有任务的最少初始能量(贪心)

文章目录1. 题目2. 解题1. 题目 给你一个任务数组 tasks &#xff0c;其中 tasks[i] [actuali, minimumi] &#xff1a; actuali 是完成第 i 个任务 需要耗费 的实际能量。minimumi 是开始第 i 个任务前需要达到的最低能量。 比方说&#xff0c;如果任务为 [10, 12] 且你当…

sklearn分类器算法:逻辑回归及案例分析

分类算法之逻辑回归逻辑回归&#xff08;Logistic Regression&#xff09;&#xff0c;简称LR。它的特点是能够是我们的特征输入集合转化为0和1这两类的概率。一般来说&#xff0c;回归不用在分类问题上&#xff0c;因为回归是连续型模型&#xff0c;而且受噪声影响比较大。如果…

词云(WordCloud)制作

以《神雕侠侣》为例&#xff0c;我们制作词云&#xff0c;看看有哪些高频词汇。 1. 导入一些包 # -*- coding:utf-8 -*- # Python Version: 3.7 # Time: 2020/11/27 19:32 # Author: Michael Ming # Website: https://michael.blog.csdn.net/ # File: word_cloud.py # Refere…

sklearn分类器性能评估

分类器性能评估在许多实际问题中&#xff0c;衡量分类器任务的成功程度是通过固定的性能指标来获取。一般最常见使用的是准确率&#xff0c;即预测结果正确的百分比。然而有时候&#xff0c;我们关注的是负样本是否被正确诊断出来。例如&#xff0c;关于肿瘤的的判定&#xff0…

构建iOS风格移动Web应用程序的8款开发框架

http://mobile.51cto.com/web-433992.htm转载于:https://www.cnblogs.com/daishuguang/p/3633409.html

sklearn分类器算法:决策树与随机森林及案例分析

分类算法之决策树决策树是一种基本的分类方法&#xff0c;当然也可以用于回归。我们一般只讨论用于分类的决策树。决策树模型呈树形结构。在分类问题中&#xff0c;表示基于特征对实例进行分类的过程&#xff0c;它可以认为是if-then规则的集合。在决策树的结构中&#xff0c;每…

天池 在线编程 求和查找

文章目录1. 题目2. 解题1. 题目 来源&#xff1a;https://tianchi.aliyun.com/oj/164427478262600292/204998627646706400 2. 解题 暴力 哈希查找 class Solution { public:/*** param inputs: an integer array* param tests: an integer array* return: return true if s…

[转]python 中的字符串连接

python 中可使用 进行字符串的连接操作 但很多文档里都说,python 使用 进行字符串连接的效率低下 这直接导致本人在代码中不敢使用 进行字符串的连接操作 可事实又是怎样呢&#xff1f; 之所以说python 中使用 进行字符串连接的操作效率低下&#xff0c;是因为python中字符…