MVC中将视图也打包成资源随程序集一起发布

利用asp.net MVC的扩展性,我们可以重新定义视图引擎,将视图文件*.cshtml也一并打包到程序集中。

这样可以提高基于MVC框架的程序集的独立性,简化部署难度。

首选重新定义一个视图引擎:

源码如下:

namespace Helpers
{
    /// <summary>
    /// 对标准的RazorViewEngine扩展,以使得视图引擎能找到程序集中打包的资源作为视图
    /// </summary>
    public class ResViewEngine : RazorViewEngine
    {
        /// <summary>
        /// 资源可能在的命名空间集合
        /// </summary>
        [Inject]
        public string[] ResNamespaces { get; set; }
        private static string rootPath = System.Web.Hosting.HostingEnvironment.MapPath("~");

        private string[] _startWiths = { "~/Views/", "~/Areas/" };
        private string logFile = Path.Combine(rootPath, "App_Data", "ResViews.txt");
        public ResViewEngine()
        {
            //删除以前写过的文件
            if (File.Exists(logFile))
            {
                string[] fileNameStrs = File.ReadAllText(logFile).Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

                foreach (string fn in fileNameStrs)
                {
                    if (File.Exists(fn))
                        File.Delete(fn);
                }
                File.Delete(logFile);
            }
        }

        protected override bool FileExists(ControllerContext controllerContext, string virtualPath)
        {
            if (base.FileExists(controllerContext, virtualPath))
            {
                return true;
            }
            if (ResNamespaces == null) return false;

            foreach (string startWith in _startWiths)
            {
                if (!virtualPath.StartsWith(startWith)) continue;
                string tail = virtualPath.Substring(startWith.Length);
                tail = tail.Replace("/", ".");
                Stream stream = null;
                foreach (string ns in ResNamespaces)
                {
                    string nst = ns.Replace(".Controllers", "");
                    string resName = nst + startWith.Replace("/", ".").Replace("~", "") + tail;
                    stream = Assembly.Load(nst).GetManifestResourceStream(resName);
                    if (stream != null) break;
                }
                if (stream == null) return false;
                string path = controllerContext.HttpContext.Server.MapPath(virtualPath);
                IOHelper.WriteStreamToFile(stream, path);

                //将写过的文件路径名记入一个文本文件
                File.AppendAllText(logFile, path + Environment.NewLine);
            }
            return base.FileExists(controllerContext, virtualPath);
        }
    }
}

当然,有一些帮助类需要自行补充。

还需要在global.asax.cs中将上述的视图引擎取代原有的:

        protected virtual void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            //......

            ViewEngines.Engines.Clear();
            ViewEngines.Engines.Add(new ResViewEngine());
        }

最后,将需要打包的视图在VS2013中,按F4进入属性窗口,生成操作,选择”嵌入的资源“

时间: 2024-11-13 06:53:30

MVC中将视图也打包成资源随程序集一起发布的相关文章

【打包成exe安装包文件发布你的程序】使用QT联系人管理系统的例子

[前言]在 QT数据库使用案列[联系人]-- 使用sqlite和QStringListModel 中,我们写了这个程序,如何将它打包成安装文件发给其他小伙伴呢? 我们使用 nsis-2.46-setup.exe[点我下载] nisedit2.0.3.exe [点我下载] 这两个软件. [目标] 我们将要制作的安装包效果. [安装好运行] [源码下载] http://pan.baidu.com/s/1qWLUqWO [步骤] 我们用QtCreater开发好程序后.大概目录如下 [QT下面的动态库都

体验 ASP.NET Core 1.1 中预编译 MVC Razor 视图

这是从 ASP.NET Core 1.1 官方发布博文中学到的一招,可以在 dontet publish 时将 Razor 视图编译为 .dll 文件. 需要在 project.json 中添加如下配置: 1)在 "dependencies" 中添加: "Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Design": "1.1.0-preview4-final" 2)在"tools&quo

android 导包 导入jar包,打包jar包,打包成library。 KanKanStyle

(1)项目导入JAR包: 1.在项目EC或MYec里,将外部jar包拷贝在个libs目录里面.老的项目没有lib目录,活着叫lib,会报错,要改成libs 2.右键点击项目,Bulid Path->Configure Build Path 3.在设置Libraies项,选择刚才的位置添加jar包. 3.在Order and Export项里,将外部jar包选中.(很多时候,可以免去) 4.clean项目后,重新编译,这时的apk包里应该是包含外部jar啦. 在MyEc或androidStudio

AndroidStudio项目制作SDK和打包成jar

这里将详细介绍AndroidStuido项目,开发过程中将AS项目打包成jar,及arr的使用 1.新建一个项目(步骤省略) 2.(在步骤1的基础上)点击File-->New-->New Module->选择Android Library-->点击Next(如下图:) 3.定义好Library的工程名:mylibrary(如下图: 4.在项目中会引入该Module (app下的build.gradle 5.创建之前我先在mylibrary工程中建一个测试类,方便测试调用: 6.在m

如何将Debug文件夹下的资源打包成一个EXE文件直接执行

如何将Debug文件夹下的资源打包成一个EXE文件直接执行 前言:前段时间写了个小程序,想分享给好友看看,可所以资源都放在Debug文件夹下,整个文件夹发给人家这也太……,为了显得稍微专业一点,想把它们打包一个EXE文件执行,因为我见到到这样的程序,直接一个EXE程序,一点直接运行,顿时感觉好吊,于是乎,搜啊搜,搞定了,总结如下. 效果图: 原来的一坨文件 现在的一个单独的EXE文件,看起来就很吊的样子 第一步:打包 将所有的文件打包成一个RAR压缩包,没错,直接打成RAR包! 第二步:解压选项

如何打包成多个资源文件

九:如何打包成多个资源文件 我们在开发页面的时候,有时候需要有多个入口文件,做到文件是按需加载,这样就可以使用缓存提升性能:那么我们接下来需要如何配置呢?现在我们继续做demo,现在比如我现在的项目文件结构如下: 我们直接看 webpack.config.js配置代码变成如下: module.exports = { entry: { "main": "./src/main.js", "index": "./src/index.js&qu

将引用了第三方jar包的Java项目打包成jar文件的两种方法

方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目下建立文件MANIFEST.MF,内容如下: Manifest-Version: 1.0 Class-Path: lib/commons-codec.jar lib/commons-httpclient-3.1.jar lib/commons-logging-1.1.jar lib/log4j-1.

VS2010把项目发布、打包成可安装部署的应用程序

本文要解决的问题: 详细介绍用VS2010将项目发布.打包成可部署的应用程序的过程,通过一步步操作,最后能顺利完成. 1. 在vs2010 选择"新建项目"à" 其他项目类型"à" Visual Studio Installerà "安装项目": 命名为:Setup1 . 这是在VS2010中将有三个文件夹, 1."应用程序文件夹"表示要安装的应用程序需要添加的文件: 2."用户的'程序'菜单"表

BoxedApp Packer 将您的原始应用“打包”成单个完全的可执行二进制文件

及时应对移动化趋势 在没有安装到本地硬盘驱动的情况下,使用闪存卡.网络文件夹或者可移动磁盘远程启动应用程序通常是一件令人头疼的事,你会发现,应用程序会突然会丢失文件.路径错误或者远程注册表故障等一系列问题.(真奇怪,别人都接触不到我的注册表,还怎么能对它进行改动!) 当安装一个应用不再是一个好的选择的时候,另外的方式就是将它变成一个可执行文件,不依赖外部资源,可以随时随地运行. 将应用压缩到二进制文件中 BoxedApp Packer是一个开发者实用工具,能将您的原始应用“打包”成单个完全的可执