(1-1)文件结构的升级(Area和Filter知识总结) - ASP.NET从MVC5升级到MVC6

ASP.NET从MVC5升级到MVC6 总目录

MVC5项目结构

带有Areas和Filter的项目结构

一般来说,小的MVC项目是不考虑领域的,但是,如果是稍微复杂一点的项目,往往是需要领域这个概念的。
一个领域就是一个小型的MVC项目,所以领域Area的目录结构和普通的目录结构是一样的。(具有Controllers和Views目录,以及一个AreaRegistration文件)
一个MVC项目,Controllers和Views这两个目录由于约定的关系,文件夹的名称和相对位置是不能变化的。
在默认的配置下,Controllers下面的Controller和Views下面的子文件夹是一一对应的。Controller里面的方法和View下面的CSHTML视图也是一一对应的。
Model这个文件夹不是必须的,而且按照趋势,Model一般被归为BussinessLogic,往往存在于业务的工程中。数据模型的问题,这里不进行讨论。

Thumbnail?filename=00000003_20160516155336_FolderMVC5.PNG

AreaRegistration文件

一个AreaRegistration文件是这样的: AdminAreaRegistration.cs 请注意命名规范,MVC这样的约定氛围很浓重的框架,最好按照规定命名。

using System.Web.Mvc;namespace WebSite.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 {controller = "Home", action = "Index", id = UrlParameter.Optional});}}
}

当然使得这个Area注册生效的源头是Global.asax 里面的 RegisterAllAreas 方法

    public class MvcApplication : HttpApplication{protected void Application_Start(){//MVCAreaRegistration.RegisterAllAreas();GlobalConfiguration.Configure(WebApiConfig.Register);FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);RouteConfig.RegisterRoutes(RouteTable.Routes);

RouteConfig.cs(位于App_Start文件夹下面)可以设定默认的领域。

using System.Web.Mvc;
using System.Web.Routing;namespace WebSite
{public class RouteConfig{public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapRoute("Default", "{area}/{controller}/{action}/{id}",new {area = "Admin", controller = "Home", action = "Index", id = UrlParameter.Optional},new[] {"WebSite.Areas.Admin.*"}).DataTokens.Add("area", "Admin");}}
}

Filter

Filter也不是MVC的标配,但是往往一个复杂的项目会有一些Filter。Filter可以完成很多不同的工作,对于某个环节的输入和输出进行一些干预。当然Filter也必须注册才能使用。FilterConfig.cs

using System.Web.Mvc;namespace WebSite
{public class FilterConfig{public static void RegisterGlobalFilters(GlobalFilterCollection filters){//默认错误处理filters.Add(new HandleErrorAttribute());//日志filters.Add(new LoggerAttribute());//异常记录filters.Add(new ExceptionHandlerAttribute());//压缩filters.Add(new CompressAttribute());}}
}

压缩

using System.IO.Compression;
using System.Web.Mvc;namespace WebSite
{OnActionExecuting的时候,可以设定输出的压缩public class CompressAttribute : ActionFilterAttribute{public override void OnActionExecuting(ActionExecutingContext filterContext){var acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"];if (!string.IsNullOrEmpty(acceptEncoding)){acceptEncoding = acceptEncoding.ToLower();var response = filterContext.HttpContext.Response;if (acceptEncoding.Contains("gzip")){response.AppendHeader("Content-encoding", "gzip");response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);}else if (acceptEncoding.Contains("deflate")){response.AppendHeader("Content-encoding", "deflate");response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);}}}}
}

错误处理

OnException 出现错误的时候可以进行一些处理

using System.Web.Mvc;
using InfraStructure.Log;
using InfraStructure.Utility;namespace WebSite
{public class ExceptionHandlerAttribute : HandleErrorAttribute{public override void OnException(ExceptionContext actionExecutedContext){var actionName = actionExecutedContext.RouteData.Values["action"].ToString();var controllerName = actionExecutedContext.RouteData.Values["controller"].ToString();var username = string.Empty;if (actionExecutedContext.HttpContext.Session[ConstHelper.Username] != null){username = actionExecutedContext.HttpContext.Session[ConstHelper.Username].ToString();}ExceptionLog.Log(username, actionName, controllerName, actionExecutedContext.Exception.StackTrace);}}
}

日志

如果希望每个Action都有执行日志可以这样,OnActionExecuted之后,可以添加一些动作

using System.Web.Mvc;
using InfraStructure.Log;
using InfraStructure.Utility;namespace WebSite
{public class LoggerAttribute : ActionFilterAttribute{public override void OnActionExecuted(ActionExecutedContext filterContext){var actionName = filterContext.ActionDescriptor.ActionName;var controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;var username = string.Empty;if (filterContext.HttpContext.Session[ConstHelper.Username] != null){username = filterContext.HttpContext.Session[ConstHelper.Username].ToString();}InfoLog.Log(username, actionName, controllerName);}}
}

安全

如果每个Controller都进行相同的安全检查,代码量很庞大,可以设定一个SecurityController,然后所有的Controller都继承与SecurityController。

using InfraStructure.Helper;
using InfraStructure.Log;
using InfraStructure.Table;
using InfraStructure.Utility;namespace WebSite.Areas.Admin.Controllers
{public class DataViewSetController : SecurityController{// GET: Develop/DataViewSetpublic ActionResult Index(){var list = OwnerTableOperator.GetRecListByOwnerId<DataViewSet>(DataViewSet.CollectionName, OwnerId);//MasterTable Sort Function//list.Sort((x, y) => { return x.Rank - y.Rank; });ViewData.Model = list;return View();}

本质上还是在运行Action的时候(OnActionExecuting),进行一些抢先过滤。

using System.Web.Mvc;
using BussinessLogic.Security;
using InfraStructure.Utility;namespace WebSite
{public class SecurityController : Controller{/// <summary>///     验证/// </summary>/// <param name="filterContext"></param>protected override void OnActionExecuting(ActionExecutingContext filterContext){if (Session[ConstHelper.OwnerId] == null){filterContext.Result = RedirectToAction("Index", "Home", new { area = "Admin" });return;}OwnerId = Session[ConstHelper.OwnerId].ToString();EmployeeInfoType = Session[ConstHelper.EmployeeInfoType].ToString();Username = Session[ConstHelper.Username].ToString();AccountCode = Session[ConstHelper.Account].ToString();Privilege = Session[ConstHelper.Privilege].ToString().GetEnum(PrivilegeType.None);ViewBag.Privilege = Privilege;ViewBag.OwnerId = OwnerId;}}
}

MVC6

Area

如果你上网检索关于Area的信息,下面的文章大概会引起你的关注,可惜里面的Sample已经没有了。
using areas in asp-net-5

如果你想完整的看一个MVC6带有Area的例子,MusicStore则应该可以满足你的需求。
MusicStore示例

Area的目录结构还是和MVC5一样:MusicStore/Areas/Admin/
这个也没有什么好修改的。至于Area的路由问题,将在路由里面进一步讨论。

Filter

下面这篇文章很好的介绍了Filter的问题,目录结构还是和MVC5一样(原作者已经更新到RC2了)

asp-net-5-action-filters

Because the filters will be used as a ServiceType, the different custom filters need to be registered with the framework IoC. If the action filters were used directly, this would not be required.

这里也是需要为Filter进行注册了,只是注册的方式变成下面的方式:

public void ConfigureServices(IServiceCollection services)
{services.AddMvc();services.AddScoped<ConsoleLogActionOneFilter>();services.AddScoped<ConsoleLogActionTwoFilter>();services.AddScoped<ClassConsoleLogActionOneFilter>();
}

工具制作(计划中)

界面和整体流程

我在考虑是否要做这样一个工具:
工具的界面如下所示,两个文本框,一个是MVC5目录,一个是MVC6目录。一个升级按钮。
然后一键可以将MVC5 尽可能 得升级到MVC6。

Thumbnail?filename=00000003_20160516163239_ToolImage001.PNG

整体工具的框架也很简单

        /// <summary>///     Start To Upgrade MVC5 to MVC6/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btnUpgrade_Click(object sender, EventArgs e){//测试用开始txtMVC5Root.Text = @"E:\WorkSpace\DominoHR\WebSite";txtMVC6Root.Text = @"E:\WorkSpace\MVCMigratiorLib";//测试用结束SystemManager.mvc5Root = txtMVC5Root.Text;SystemManager.mvc6Root = txtMVC6Root.Text;//Init(Log准备)SystemManager.Init();//Analyze The FolderStructureAnalyze.Analyze();//UpgradeMainUpgrade.Upgrade();//Terminte(Log关闭)SystemManager.Terminate();}

这里的代码省略LOG输出等次要但是必须的功能介绍,一个好的工具必须有LOG。同时,这个工具不能对原来的MVC5文件进行任何的修改,这个是大原则,所有的文件都必须复制到新的目录下面进行修改

在考虑MVC6的目录之前,我们先来看看如何分析MVC5的目录结构。
这里很简单,就是把顶层目录都遍历一遍即可,没有什么技术含量。当然,由于目录信息都保存起来了,很容易做出HasArea,HasFilter这样的属性方法。

        /// <summary>/// Has Areas/// </summary>public static bool HasAreas {get {return RootFolder.ContainsKey(strAreas);}}/// <summary>/// Analyze /// </summary>public static void Analyze() {//Get Top Level Folder Listforeach (var topLevelFolder in Directory.GetDirectories(SystemManager.mvc5Root)){string folderName = new FileInfo(topLevelFolder).Name;RootFolder.Add(folderName, topLevelFolder);SystemManager.Log("topLevelFolder:" + folderName);}AppendReport();}

本文已经同步到 http://www.codesnippet.info/Article/Index?ArticleId=00000024
ASP.NET从MVC5升级到MVC6 总目录

转载于:https://www.cnblogs.com/TextEditor/p/5507770.html

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

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

相关文章

oracle数据库存储结构语句,oracle基本语句(第五章、数据库逻辑存储结构管理)...

1、使用SYS用户以SYSDBA身份登录到SQL Plus&#xff0c;使用视图V$TABLESPACE查看表空间信息SELECT * FROM V$TABLESPACE;2、查看视图DBA_TABLESPACES查看所有表空间的属性和在线状态SELECT TABLESPACE_NAME, CONTENTS, STATUSFROMDBA_TABLESPACES;--表空间名&#xff0c;表空间…

重启模块与及关开邮件存储设置功能页面-PHP-shell-py

邮件系统几百台&#xff0c;每台负责 grep -P "^ip\d.\d." /home/mymail/newconf/hosts.conf -c465 每台机器负责启动的模块又是不一样的如&#xff1a; A机器&#xff1a; ProgramsList"1svr,2svr,3svr,4svr," b机器&#xff1a; ProgramsList"asvr,…

oracle 表达式1000,oracle环境下占用编号的方法报语法错误:ORA-01795: 列表中的最大表达式数为 1000...

oracle 环境下&#xff0c;调用方法NumberCodeGenerateManager.OcuppyModelNumberCodesAfterSaved(ObjectID, modelID, ds)进行编号占用。当DataSet的数据行数〉1000时&#xff0c;会报语法错误&#xff1a;ORA-01795: 列表中的最大表达式数为 1000。跟踪语句如下&#xff1a;u…

奋斗路上的励志

当初看蜘蛛侠印象最深的一句台词就是“你是怎么样的人取决于你选择做什么样的人”。 昨天的你&#xff0c;你不可能完全忘记&#xff0c;但是你知道你曾经有多可耻卑微&#xff0c;重要的是你要做什么样的人&#xff0c;明天你会是什么样的你&#xff0c;重在做好现在的你。 坚…

用IIS配置反向代理

https://natapp.cn/ http://blog.csdn.net/g2321514568/article/details/12406755 目标服务器&#xff1a;targetServer 配置反向代理的服务器&#xff1a;reveseProxServer 1、确定最终访问的网址&#xff1a;比如www.baidu.com 、www.csdn.net等等。 当然你也可以自己在targ…

oracle存储过程使用ftp,ASM存储FTP上传文件

引用SQL>execute dbms_xdb.sethttpport(8080);SQL>execute dbms_xdb.setftpport(2100);SQL>commit;检查端口是否开启引用SQL> select dbms_xdb.GETHTTPPORT() from dual;DBMS_XDB.GETHTTPPORT()----------------------8080SQL> select dbms_xdb.GETFTPPORT() fr…

Python学习笔记——基础篇【第六周】——hashlib模块

常用模块之hashlib模块  用于加密相关的操作&#xff0c;3.x里代替了md5模块和sha模块&#xff0c;主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 &#xff0c;MD5 算法 import md5 hash md5.new() hash.update(admin) print hash.hexdigest() MD5-废弃import shahash sha…

oracle数据库领域,菜鸟成长课程之《Oracle数据库职业直通车》,引领大家真正进入Oracle数据库领域...

课程简介&#xff1a;近年来&#xff0c;Oracle数据库无疑是全球数据库领域中的领航者&#xff0c; Oracle DBA的待遇节节攀升&#xff0c; 导致了许多人希望转入这个行业。而Oracle数据库又因它的庞大和复杂另很多人望而却步&#xff0c;找不到入门的捷径。本课程是专门为在校…

虚拟存储

为解决日益增长的内存需要&#xff0c;有以下几种解决办法&#xff1a; 1.覆盖&#xff1a; 将程序划分成几个模块&#xff0c;将没有调用关系的模块&#xff08;即不会同时运行的模块&#xff09;分成一组&#xff0c;其中每组所占的内存大小为组内所需内存最大的模块的内存&a…

oracle 12542,TNS-12542: TNS:address already in use

研发说无法访问数据库&#xff0c;数据库正常运行&#xff0c;那就可能是监听有问题&#xff0c;一波简单操作搞定。[oracleentegor-1 ~]$ lsnrctl startLSNRCTL for Linux: Version 11.2.0.4.0 - Production on 17-AUG-2018 09:04:01Copyright (c) 1991, 2013, Oracle. All ri…

作为前端应当了解的Web缓存知识

缓存优点 通常所说的Web缓存指的是可以自动保存常见http请求副本的http设备。对于前端开发者来说&#xff0c;浏览器充当了重要角色。除此外常见的还有各种各样的代理服务器也可以做缓存。当Web请求到达缓存时&#xff0c;缓存从本地副本中提取这个副本内容而不需要经过服务器。…

怎么恢复oracle的包,【学习笔记】使用dbms_backup_restore包恢复数据库

天萃荷净使用dbms_backup_restore包恢复数据库Oracle提供了一个包:DBMS_BACKUP_RESTORE包是由dbmsbkrs.sql 和 prvtbkrs.plb 这两个脚本创建的.catproc.sql 脚本运行后会调用这两个包.所以是每个数据库都有的这个包是Oracle服务器和操作系统之间IO操作的接口.由恢复管理器直接调…

No module named 'urllib2'

import urllib2 response urllib2.urlopen(http://www.baidu.com/) html response.read() print html 报错 import urllib2ImportError: No module named urllib2 import urllib.request respurllib.request.urlopen(http://www.baidu.com) htmlresp.read() print(h…

oracle负数怎么比较大小,输出负数【oracle学习吧】_百度贴吧

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼题目&#xff1a;哪些选项输出一个负数&#xff1f;如果你确信以下都不对&#xff0c;那么请选E[sql]A DECLAREl_date2 DATE : date 2012-12-20;l_date1 DATE : l_date2 - 1;BEGINDBMS_OUTPUT.put_line (MONTHS_BETWEEN (l_date1, …

文件属性操作

//文件类型 &#xff1a;文件 file 文件夹(目录) dir两种 //1.获取文件类型 filetype("路径"); //如果是文件返回file 如果是目录返回dir//2.判断文件类型 is_dir("路径"); //判断给定的路径是不是目录is_file("路径"); //判断给定的路…

linux 提取日志字段,记一次Linux下提取MySQL日志关键字段

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;环境说明操作系统&#xff1a;centos7sed版本&#xff1a;4.2.2egrep版本&#xff1a;2.20paste版本&#xff1a;8.22提取要求一次同事说&#xff0c;需要提取MySQ…

linux 那些事儿之我是 u 盘,《Linux那些事儿之我是USB》.PDF

《Linux 那些事儿之我是 USB》作者&#xff1a;华清远见第 1 章 Linux 那些事儿之我是 USB Core专业始于专注 卓识源于远见1 &#xff0e;引子老夫子们痛心疾首地总结说&#xff0c;现代青年的写照是——自负太高&#xff0c;反对太多&#xff0c;商议太久&#xff0c;行动太迟…

Systemd 入门教程:命令篇

http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html转载于:https://www.cnblogs.com/zengkefu/p/5527003.html

linux链接达梦数据库,linux下面 达梦数据库的JDBC链接

此次由于学习上面的事情&#xff0c;接触到了达梦数据库&#xff0c;这是第一次用&#xff0c;去年有个关于隐通道的课程设计&#xff0c;其实就已经差很少算了解了点点&#xff0c;相对与国外主流数据库&#xff0c;Dm7有个很明显的特色&#xff0c;那就是它的安全级别&#x…

[转]字符串和编码

编码是真的是非常头疼的一个问题。 看到一份说的非常简洁清晰的文章&#xff0c;分享记录一下。 廖雪峰&#xff1a; 字符串和编码转载于:https://www.cnblogs.com/oDoraemon/p/5533221.html