使用RazorGenerator和预编译MVC引擎将Razor视图编译成DLL

Web开发中常常会有跨页面、跨站点、跨项目组的复用模块(界面),最常见的就是如下方所示的Web页面上用于显示登录或用户名的头部模块,

使用ASP.NET MVC开发中,常见的做法是写成部分视图,本文的目的则是进一步将这部分视图预编译成DLL,

这样就可以不直接暴露源码的提供复用组件,适合跨项目组的协作开发。

技术点

  • Razor Generator(Razor单文件生产器)
  • RazorGenerator.Mvc(Razor视图预编译引擎)

步骤一:安装拓展,项目准备

首先,为VS安装Razor Generator(Razor单文件生产器)

操作步骤:菜单-->拓展和更新-->联机-->搜索“Razor Generator”

其次,新建一个新的类库,在新建的类库下新建Views/Share路径,用于存放要被预编译的Razor视图,

新建这个路径的目的,是为了让预编译的Razor视图产生的虚拟路径为~/Views/Shared/

ps:后来才发现Views/Share路径少了个字母,应为Views/Shared。 因为是边写代码边截图的,所以下面的截图都少了个d

示例项目如下

步骤二:编写Razor视图

默认情况下,类库中是无法识别Razor视图,也无法直接新建Razor视图的;

因为我们已经安装了拓展工具 Razor Generator(Razor单文件生产器),时类库已经可以识别Razor视图了,但依然是无法直接新建Razor视图;

不过,我们可以通过间接的方法来达到我们的目的,在DemoComponents/Views/Shared目录下新建一个HTML页,并重命名修改其格式为.cshtml

接下来我们编写Razor视图的代码,并对TopBar.chhtml属性进行修改:属性-->自定义工具-->设置为RazorGenerator;

@model DemoComponents.TopBarModel
@{
    Layout = null;
}
<style type="text/css">
    .topbar_container {
        height: 40px;
        background-color: #dddddd;
        border-bottom: 1px solid #808080;
    }

    .topbar_logo {
        float: left;
        width: 200px;
        height: 40px;
        margin-left: 50px;
        line-height: 40px;
    }

    .topbar_user {
        float: right;
        width: 96px;
        height: 36px;
        margin: 2px;
        font-size: 16px;
        border: 1px solid #ff0000;
    }

    .topbar_modules {
        float: right;
        width: 350px;
        height: 40px;
    }
    .topbar_modules div {
        float: left;
        width: 96px;
        height: 36px;
        margin: 2px;
        border: 1px solid #ff0000;
    }
</style>
<div class="topbar_container">
    <div class="topbar_logo">我是logo</div>

    <div class="topbar_modules">
        @foreach (var item in Model.Modules)
        {
            <div>@item</div>
        }
    </div>
    <div class="topbar_user">
        @Model.UserName
    </div>
</div>

视图代码

保存,RazorGenerator就会为TopBar.cshtml生成一个新文件,如下图所示。

如果没有生成新文件,则说明没有正确安装RazorGenerator或者没有正确设置TopBar.chhtml属性。

打开TopBar.generated.cs文件会有以下报错信息。

通过简要的分析,可以知道这是因为还没有为DemoComponents添加Razor视图的依赖项导致的,导致它无法编译。

OK,为DemoComponents类库添加System.Web、System.Web.Helpers、System.Web.Mvc、System.Web.WebPages的引用。

再次保存,成功生成的代码结果如下,本阶段的工作完成。

#pragma warning disable 1591
//------------------------------------------------------------------------------
// <auto-generated>
//     此代码由工具生成。
//     运行时版本:4.0.30319.42000
//
//     对此文件的更改可能会导致不正确的行为,并且如果
//     重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------

namespace ASP
{
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Web;
    using System.Web.Helpers;
    using System.Web.Mvc;
    using System.Web.Mvc.Ajax;
    using System.Web.Mvc.Html;
    using System.Web.Routing;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.WebPages;

    [System.CodeDom.Compiler.GeneratedCodeAttribute("RazorGenerator", "2.0.0.0")]
    [System.Web.WebPages.PageVirtualPathAttribute("~/Views/Share/TopBar.cshtml")]
    public partial class _Views_Share_TopBar_cshtml : System.Web.Mvc.WebViewPage<DemoComponents.TopBarModel>
    {
        public _Views_Share_TopBar_cshtml()
        {
        }
        public override void Execute()
        {

            #line 2 "..\..\Views\Share\TopBar.cshtml"

    Layout = null;

            #line default
            #line hidden
WriteLiteral("\r\n<style");

WriteLiteral(" type=\"text/css\"");

WriteLiteral(@">
    .topbar_container {
        height: 40px;
        background-color: #dddddd;
        border-bottom: 1px solid #808080;
    }

    .topbar_logo {
        float: left;
        width: 200px;
        height: 40px;
        margin-left: 50px;
        line-height: 40px;
    }

    .topbar_user {
        float: right;
        width: 96px;
        height: 36px;
        margin: 2px;
        font-size: 16px;
        border: 1px solid #ff0000;
    }

    .topbar_modules {
        float: right;
        width: 300px;
        height: 40px;
    }

        .topbar_modules div {
            float: left;
            width: 96px;
            height: 36px;
            margin: 2px;
            border: 1px solid #ff0000;
        }
</style>
<div");

WriteLiteral(" class=\"topbar_container\"");

WriteLiteral(">\r\n    <div");

WriteLiteral(" class=\"topbar_logo\"");

WriteLiteral(">我是logo</div>\r\n    <div");

WriteLiteral(" class=\"topbar_user\"");

WriteLiteral(">\r\n");

WriteLiteral("        ");

            #line 46 "..\..\Views\Share\TopBar.cshtml"
   Write(Model.UserName);

            #line default
            #line hidden
WriteLiteral("\r\n    </div>\r\n    <div");

WriteLiteral(" class=\"topbar_modules\"");

WriteLiteral(">\r\n");

            #line 49 "..\..\Views\Share\TopBar.cshtml"

            #line default
            #line hidden

            #line 49 "..\..\Views\Share\TopBar.cshtml"
         foreach (var item in Model.Modules)
        {

            #line default
            #line hidden
WriteLiteral("        <div>");

            #line 51 "..\..\Views\Share\TopBar.cshtml"
        Write(item);

            #line default
            #line hidden
WriteLiteral("</div>\r\n");

            #line 52 "..\..\Views\Share\TopBar.cshtml"
        }

            #line default
            #line hidden
WriteLiteral("    </div>\r\n</div>\r\n\r\n");

        }
    }
}
#pragma warning restore 1591

步骤三:对生成的代码进行修改

TopBar.generated.cs 自动生成的代码有两处不如人意的地方,需要我们对它进行修改。(修改过后不要再去操作TopBar.chhtml,否则我们的修改的内容将会被覆盖)

步骤四:引入RazorGenerator.Mvc完成预编译

右键DemoComponents项目-->管理NuGet程序包-->搜索“RazorGenerator.Mvc”-->安装

成功RazorGenerator.Mvc安装后,会在项目下新增几个文件,如下图所示。

RazorGeneratorMvcStart会在MVC程序启动时自动运行,不需要程序员做任何操作。

右键重新生成DemoComponents项目编译输出DLL,到此本文的工作(Razor视图的预编译)全部完成。

效果展示及代码下载

https://pan.baidu.com/s/1geRqveV

web视图代码及其运行效果如下(TopBar预编译的路径为~/Views/Shared/,所以可以直接不带路径的使用该视图)

时间: 2024-10-13 16:06:13

使用RazorGenerator和预编译MVC引擎将Razor视图编译成DLL的相关文章

理解ASP.NET MVC中的Razor视图引擎

什么是 Razor ? Razor 是一种允许向网页中嵌入基于服务器的代码(C#)的标记语法,是微软针对ASP.NET MVC推出的模板引擎. C# 的主要 Razor 语法规则 Razor 代码封装于 @{ ... } 中 行内表达式(变量和函数)以 @ 开头 代码语句以分号结尾 字符串由引号包围 C# 代码对大小写敏感 C# 文件的扩展名是 .cshtml <!-- 单行代码块 --> @{ var myMessage = "Hello World"; } <!-

体验 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

.NET MVC4 Razor视图预编译

在平时使用.NET MVC中会不会有这样子的需求:某些razor视图,特别是系统后台的视图,不想让用户自行更改或者是觉得razor执行效率不高,需要能够把razor预编译到dll文件中去提高执行效率!(道听途说,具体没测...) VS并不提供razor的预编译,如果需要对razor预编译需要借助第三方工具 SO,Let's Begin! 这里以VS2013为例 依次选择:工具---扩展和更新---左侧选择“联机”---搜索“RazorGenerator”,然后安装 2,对MVC项目中的Razor

[转载].NET MVC4 Razor 视图预编译

平时使用.NET MVC中不乏有类似的需求:某些razor视图,特别是系统后台的视图,不想让用户自行更改,需要通过某种方法把视图模板编译到项目的dll中去. 但是VS并不提供razor的预编译,如果需要对razor预编译需要借助第三方工具:Razor Generator 这里以VS2013为例 1,依次选择:工具---扩展和更新---左侧选择“联机”---搜索“RazorGenerator”,然后安装 2,对MVC项目中的Razor视图右键--属性--生成操作“无”,自定义工具“razorgen

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

Razor 视图引擎 &ndash; ASP.NET MVC 4 系列

       Razor 视图引擎是 ASP.NET MVC 3 开始扩展的内容,并且也是默认视图引擎.        Razor 通过理解标记的结构来实现代码和标记之间尽可能顺畅的转换.下面的例子演示了一个包含少量视图逻辑的简单 Razor 视图: @{ // this is a block of code. For demonstration purposes, // we'll create a "model" inline. var items = new string[] {

ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. Razor在减少代码冗余.增强代码可读性和Visual Studio智能感知方面,都有着突出的优势.Razor一经推出就深受广大ASP.Net开发者的喜爱. 1.2 Razor的语法 (1)Razor文件类型:Razor支持两种文件类型,分

2014-07-29 浅谈MVC框架中Razor与ASPX视图引擎

今天是在吾索实习的第15天.随着准备工作的完善,我们小组将逐步开始手机端BBS的开发,而且我们将计划使用MVC框架进行该系统的开发.虽然我们对MVC框架并不是非常熟悉,或许这会降低我们开发该系统的效率,但是我们可以通过边学边做的方式来实现其开发的.这不仅便于我们日后对系统的管理与维护,而且还给我们带来一个学习的动力与实践的地方. 但我们在创建一个基于MVC框架的项目时,就遇到一些问题了.那就是MVC的视图引擎是有两种的,一种是Razor,会以cshtml后缀的文件作为视图文件:另一种是ASPX,

C预编译, 预处理, C/C++头文件, 编译控制,

在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征.依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的. 其格式一般为: #Pragma Para 其中Para 为参数,下面来看一些常用的参数. (1)message 参数. Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输