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,往往存在于业务的工程中。数据模型的问题,这里不进行讨论。

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。

整体工具的框架也很简单

        /// <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

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

  1. matepad什么时候升级鸿蒙,华为MatePad Pro迎来EMUI 11正式版升级 后续可直接升级鸿蒙系统...

    原标题:华为MatePad Pro可升级EMUI 11正式版了 快来尝鲜! 据华为EMUI官方消息,华为MatePad Pro与MatePad Pro 5G两款平板迎来EMUI 11正式版升级.用户打 ...

  2. SQL 2008升级SQL 2008 R2完全教程或者10.00.1600升级10.50.1600

    今天将由于需要就将我的SQL 2008升级到SQL 2008 R2. 说到为什么要升级是因为,从另一台机器上备份了一个数据库,到我的机器上还原的时候提示"System.Data.SqlCli ...

  3. 知识中台,驱动产业智能化升级

    随着人工智能技术的进步,智能化成为产业转型升级的关键抓手,但企业在提升数字化和智能化水平的实践过程中,面临多种挑战,如:移动应用的普及,带来异构数据呈几何级数增长,企业需要深度挖掘数据价值以赋能业务, ...

  4. 鸿蒙os终于开始大升级,华为鸿蒙OS终于要迎来大规模推送升级了

    等了许久,华为鸿蒙OS终于要迎来大规模推送升级了. 早在今年4月份,华为消费者业务软件部总裁王成录就曾表示,6月初,华为手机用户就可以升级鸿蒙系统了,欢迎大家到时候踊跃升级. 今日,华为鸿蒙有望下个月 ...

  5. 华为android升级国内版,华为EMUI5.0系统升级成为国内安卓升级的标杆

    原标题:华为EMUI5.0系统升级成为国内安卓升级的标杆 Android8.0都发布了,你还没用上Android 7.0吗?在智能手机已成为生活的重要组成部分的时下,拥有顶级硬件配置及最新的操作系统, ...

  6. Linux包系列的知识(附:Ubuntu16.04升级到18.04的案例)

    Linux基础:https://www.cnblogs.com/dunitian/p/4822808.html#linux 之前看到朋友还动不动 apt-get update upgrade,就很纳闷 ...

  7. 知识星球如何升级为正式星球 知识星球怎么创建星球

    打开知识星球,然后我们进入到星球界面,再点击创建星球. 知识星球如何升级为正式星球 知识星球怎么创建星球听语音 接着进入到创建界面,我们输入星球名字等信息,再点击下一步. 知识星球如何升级为正式星球 ...

  8. gtk linux 升级_Linux包系列的知识(附:Ubuntu16.04升级到18.04的案例)

    Linux包系列的知识(附:Ubuntu16.04升级到18.04的案例) 发布时间:2018-05-27 12:30, 浏览次数:424 , 标签: Linux Ubuntu Linux基础:htt ...

  9. 32f4 usb 升级程序_不断中招的你还放心升级win10吗?wi10近期更新问题及解决办法...

    .专于心 精于形. Win10用户升级5月更新后屏幕出现蓝绿伪影:或跟调节色温软件有关 随着五月更新升级范围的扩大,一些问题也是加速展现在微软面前. 现在,有不少Windows 10用户反馈称,自己升 ...

最新文章

  1. int a[5]={}, a+1与(int*)a+1的区别
  2. 几个简单的正则小例子
  3. python数据驱动测试_python数据驱动--Excel维护测试用例
  4. vsflexgrid 最后一行 求和_合并单元格求和、计数、平均值,这个方法很实用
  5. Hive(Impala)测试数据生成与加载
  6. ai python 面试_面试分享系列 | 17道Python面试题,让你在求职中无往不利
  7. [转载] python 中NumPy和Pandas工具包中的函数使用笔记(方便自己查找)
  8. 【WH】MVC数据分页扩展类
  9. bzoj 2243: [SDOI2011]染色 线段树区间合并+树链剖分
  10. CentOS 关闭防火墙selinux
  11. hystrix熔断器之command实现
  12. NetXray嗅探器介绍
  13. Android-failed to set system property
  14. 京津冀地区地貌类型空间分布数据
  15. win10 cortana 没反应解决方法
  16. linux如何永久获取root,Linux如何获取root权限?我只想到这些方法了,欢迎补充
  17. shell脚本编程for循环求阶乘_shell脚本循环及函数
  18. 浅谈人机交互设计系统
  19. jason-2影像下载
  20. 跟益达学Solr5之使用Tomcat部署Solr

热门文章

  1. NetCore 依赖注入之服务之间的依赖关系
  2. POJ 3258 River Hopscotch
  3. Python 装饰器初探
  4. VUE之文字跑马灯效果
  5. javascript中的字符串和数组的互转
  6. Google Chrome 11 浏览器 下Flash Debug 插件无效的解决办法
  7. [开发技巧3]不显示报表直接打印
  8. 在ASP.NET中自动给URL地址加上超链接(好东东)
  9. mybatis 执行插入操作,insert 返回1,数据库中无数据。数据库中数据的创建时间和插入执行时间不一致。
  10. 使用cron表达式 设置定时任务