zoukankan      html  css  js  c++  java
  • 【小技巧】自定义asp.net mvc的WebFormViewEngine修改默认的目录结构

    先看一下我的解决方案的目录结构吧~~~

    一:先把Controller程序提取出来

    默认的情况是所有的****Controller.cs文件都会放在Web程序集下的一个叫Controllers的文件夹下

    这样感觉有点不爽(你懂的...)

    我们决定把所有的Controller程序放到一个自定义的应用程序集中去(上图中的mrlh.Admin.Controllers)

    先把web程序集下的Global.asax.cs文件删掉

    然后把Global.asax的标记代码改为如下:

    <%@ Application Codebehind="mrlh.Admin.Controllers.App.MvcApplication" Inherits="mrlh.Admin.Controllers.App.MvcApplication" Language="C#" %>
    

    这样应用程序启动时就会到我们自定义的应用程序集去执行相关的操作了

    mrlh.Admin.Controllers.App.MvcApplication的相关代码如下

    namespace mrlh.Admin.Controllers.App
    {
        public class MvcApplication : System.Web.HttpApplication
        {
            public static void RegisterRoutes(RouteCollection routes)
            {
                routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
                routes.MapRoute(
                    "Default", // 路由名称
                    "{controller}/{action}/{id}", // 带有参数的 URL
                    new { controller = "XiTong", action = "Index", id = UrlParameter.Optional } // 参数默认值
                );
            }
    
            protected void Application_Start()
            {
                //以下两句为启用自定义的WebFormViewEngine
                ViewEngines.Engines.Clear();
                ViewEngines.Engines.Add(new MvcViewEngine());
                AreaRegistration.RegisterAllAreas();
                RegisterRoutes(RouteTable.Routes);
               
            }
        }
    }
    
    

    这样做之后

    所有的Controller程序就不用集中写到web程序集中去了,

    就可以写在mrlh.Admin.Controllers这个程序集中了

    二:改变View文件夹的目录结构

    默认的情况是所有的****.aspx文件都放在web程序集中的Views目录下

    这样感觉也有点不爽(你懂的...)

    如果想改变aspx文件的目录结构,就必须自定义WebFormViewEngine了

    细心的读者会看到在上面的代码中Application_Start方法里前面三句话

     //以下两句为启用自定义的WebFormViewEngine
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new MvcViewEngine());
    
    

    这就是把自定义的 WebFormViewEngine添加到应用程序中去的方法

    MvcViewEngine的代码如下

    namespace mrlh.Admin.Controllers.App
    {
        public class MvcViewEngine : VirtualPathProviderViewEngine
        {
            public MvcViewEngine()
            {
                MasterLocationFormats = new[] {
                    "~/{1}View/{0}.master",
                    "~/SharedView/{0}.master"
                };
    
                AreaMasterLocationFormats = new[] {
                    "~/Areas/{2}/Views/{1}/{0}.master",
                    "~/Areas/{2}/Views/Shared/{0}.master",
                };
    
                ViewLocationFormats = new[] {
                    "~/{1}View/{0}.aspx",
                    "~/{1}View/{0}.ascx",
                    "~/SharedView/{0}.aspx",
                    "~/SharedView/{0}.ascx"
                };
    
                AreaViewLocationFormats = new[] {
                    "~/Areas/{2}/Views/{1}/{0}.aspx",
                    "~/Areas/{2}/Views/{1}/{0}.ascx",
                    "~/Areas/{2}/Views/Shared/{0}.aspx",
                    "~/Areas/{2}/Views/Shared/{0}.ascx",
                };
    
                PartialViewLocationFormats = ViewLocationFormats;
                AreaPartialViewLocationFormats = AreaViewLocationFormats;
            }
    
            protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
            {
                return new WebFormView(partialPath, null);
            }
    
            protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
            {
                return new WebFormView(viewPath, masterPath);
            }
    
        }
    }
    
    

    这样做之后类似这样的请求

    http://localhost:12232/YuanGong/YuanGong

    都会在web程序集中找到YuanGongView/YuanGong.aspx

    然后再呈现给“观众”

    注意:

      这里不能试图把每个文件夹名字中后面的"View"字样去掉,

      因为ASP.NET MVC如果发现服务器的物理路径上存在相应的文件,将直接输出了

      也就是请求是这样的http://localhost:12232/YuanGong/YuanGong

      发现服务web目录下对应有此文件YuanGong/YuanGong.aspx

      将直接输出

    三:自定义目录结构的好处

    我之所以这样做一个是为了感官上的舒服,毕竟自己的程序跟自己的媳妇一样

    不但要从触觉上考虑,还要从视觉上考虑

    另外还可以把多个web程序集的controller程序放在同一个程序集中方便代码的重用

    (忽然觉得好像面向服务编程)

    其三目录结构改变了,也方便权限的控制

    demo:https://files.cnblogs.com/liulun/MRLH.rar

  • 相关阅读:
    Controller之daemonset
    Ubuntu下Zmap的安装
    VSCode无法加载PlatformIO按钮可能的原因(踩坑笔记)
    由于更换域名或者IP变更导致WordPressg无法进入后台的问题解决办法
    使用VSCode进行Arduino与ESP32开发配置指南
    Win7下阿米洛机械键盘蓝牙配置
    IIC通讯协议与SPI通讯协议小结
    如何在树莓派上搭建个人博客系统(踩坑笔记)
    STorM32 BGC三轴云台控制板电机驱动电路设计(驱动芯片DRV8313)
    #数据结构#什么是栈及栈的作用
  • 原文地址:https://www.cnblogs.com/liulun/p/1880559.html
Copyright © 2011-2022 走看看