zoukankan      html  css  js  c++  java
  • .NET MVC4 Razor视图预编译(一)

    在平时使用.NET MVC中不乏有类似的需求:某些razor视图,特别是系统后台的视图,不想让用户自行更改,需要通过某种方法把视图模板编译到项目的dll中去。

    但是VS并不提供razor的预编译,如果需要对razor预编译需要借助第三方工具:Razor Generator 源码:http://razorgenerator.codeplex.com/

    这里以VS2013为例 

    1,依次选择:工具---扩展和更新---左侧选择“联机”---搜索“RazorGenerator”,然后安装

    2,对MVC项目中的Razor视图右键--属性--生成操作“无”,自定义工具“razorgenerator”,同时你会看到Razor页面被生成了.cs文件

        (_ViewStart.cshtml跟_Layout.cshtml等布局视图除外...) 

    3,引用PrecompiledMvcViewEngineContrib

    对项目引用点右键“管理Nuget程序包”联机查找“PrecompiledMvcViewEngineContrib”,然后添加引用

    4,App_Start中添加一个类

    public class ViewEngineStart
        {
            /// <summary>
            /// 初始化注册预编译视图
            /// </summary>
            public static void Start()
            {
                Assembly asm = Assembly.GetExecutingAssembly();
                var engine = new PrecompiledMvcEngine(new List<Assembly> { 
                    Assembly.Load("AppServer")
                });
                System.Web.Mvc.ViewEngines.Engines.Insert(0, engine);
                System.Web.WebPages.VirtualPathFactoryManager.RegisterVirtualPathFactory(engine);
            }
        }
    

    然后,Global.asax的Application_Start中执行上面类的Start方法

    ViewEngineStart.Start();

    这里就在程序初始化的时候把视图注册到虚拟路径当中了,

    最后发布项目,运行!你会发现Views里面你设置预编译的razor视图没有了,网站能够正常访问到页面!

    有几个需要注意的地方(由于刚用这个预编译,也不是太熟,后面发现新用法会持续更新)

    1、默认预编译默认只支持cshtml跟vbhtml,可以自己设置后缀,文件格式化路径

    2、预编译的时候不要预编译_ViewStart.cshtml跟_Layout.cshtml

        如果预编译了_ViewStart.cshtml,视图执行之前不会执行_ViewStart.cshtml,也就是说如果在_ViewStart.cshtml定义了Layout,这个页面会没有布局

        如果预编译了_Layout.cshtml,你会发现访问页面时候报错提示找不到_Layout.cshtml

        因为在预编译之后Layout只是一个属性,不会生成方法,如@Html.Partial都会生成Html.Partial(XXXX)方法,所以可能这里是导致Layout无效的原因!

    3、页面单独定义Layout预编译后不会起作用,而且照旧会使用没有预编译的_ViewStart.cshtml里面定义的Layout 理由同上一段

    所以如果项目的razor需要用到预编译,个人建议:

    1、如果用到模板布局,只预编译使用默认_ViewStart.cshtml定义的模板的视图,单独使用不同模板的不去预编译(因为预编译后Layout会失效,依旧会调用_ViewStart.cshtml)定义的模板

    2、如果每个页面相互独立都不需要用到模板,则可以全部预编译!

  • 相关阅读:
    Ngnix(三)—— window下布置nginx服务集群
    Java基础(一)—— 网络编程(一)—— Java Socket总结
    2018新浪Java笔试总结
    java yyyyMMddHHmmss格式字符串转换为yyyy-MM-dd HH:mm:ss格式字符串
    c# 返回多个参数(利用Tuple)
    c# 域名转换成ip地址
    myhaits if test判断字符串
    java中List转换成Json
    java打包发布程序.jar(Eclipse)
    redis设置密码
  • 原文地址:https://www.cnblogs.com/263613093/p/4309515.html
Copyright © 2011-2022 走看看