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

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

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

技术点

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

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

首先,为VS安装Razor Generator(Razor单文件生产器),操作步骤:菜单-->拓展和更新-->联机-->搜索“Razor Generator”。

其次,新建类库,并在类库下新建Views/Shared路径。

这个路径用于存放Razor视图,此时预编译Razor视图产生的虚拟路径为~/Views/Shared,在MVC项目中就可以这样使用@Html.Partial("TopBar")。

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/,所以可以直接不带路径的使用该视图)

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

  1. ASP.Net MVC(3) 之Razor视图引擎的基础语法

    Razor视图引擎的基础语法: 1.“_”开头的cshtml文档将不能在服务器上访问,和asp.net中的config文档差不多. 2.Razor语法以@开头,以@{}进行包裹. 3.语法使用: 注释 ...

  2. Razor视图引擎布局 Razor视图引擎的基本概念与法语 SQL Server Mobile 和 .NET 数据访问接口之间的数据类型映射 binary 和 varbinary datetime 和 smalldatetime float 和 real

    Razor视图引擎布局   不需要像过去aspx一样,使用.Master文件,而是统一使用.cshtml 或 .vbhtml文件.但文件名一般以 _开头,这样做文件不会当做View显示出来 使用@Re ...

  3. ASP.NET MVC 4 中Razor 视图中JS无法调试

    解决方法 1.首先检查IE中这2个属性是否勾选了. 2.选择IE浏览器进行调试,调试方法有2种     A:采用debugger;的方法,如下图所示: 这时不用调试断点就会在debugger位置中命中 ...

  4. ASP.NET MVC 4 中Razor 视图中JS无法调试 (重要)

    谷歌浏览器,firefox,IE 都可以 1.首先检查IE中这2个属性是否勾选了. 2.选择IE浏览器进行调试,调试方法有2种 A:采用debugger;的方法,如下图所示: 这时不用调试断点就会在d ...

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

    这是从 ASP.NET Core 1.1 官方发布博文中学到的一招,可以在 dontet publish 时将 Razor 视图编译为 .dll 文件. 需要在 project.json 中添加如下配 ...

  6. 理解ASP.NET MVC引擎处理模型字符串的默认行为,涉及Html.Raw()和HttpUtility.HtmlDecode()

    MVC引擎默认会将Model属性值中包含的html字符串做encode,所以如属性中包含类似 <br> 这样的标记,MVC引擎会将它们转换成html实体码 %3Cbr%3E 所以1:在编辑 ...

  7. .NET MVC4 Razor视图预编译(一)

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

  8. 使用asp.net mvc引擎开发插件系统

    一.前言 我心中的插件系统应该是像Nop那样(更牛逼的如Orchard,OSGI.NET),每个插件模块不只是一堆实现了某个业务接口的dll,然后采用反射或IOC技术来调用,而是一个完整的mvc小应用 ...

  9. ASP.NET MVC学习---(七)Razor视图引擎语法

    之前体验过razor视图引擎@符号的威力了吧~ 连我这个初学者都能感觉到确实省时省力方便快捷 简直就是居家旅行*人*货必备之物啊(这里和谐两个字~) 那么现在就开始对razor的语法进一步介绍~ 1. ...

随机推荐

  1. Python算法应用实战之队列详解

    队列是一种先进先出(First-In-First-Out,FIFO)的数据结构.队列被用在很多地方,比如提交操作系统执行的一系列进程.打印任务池等,一些仿真系统用队列来模拟银行或杂货店里排队的顾客.下 ...

  2. 将python源文件打包成exe文件

    pyinstaller 库的使用PyInstaller是一个十分有用的第三方库,它能够在Windows.Linux.Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包,Pyt ...

  3. mysql数据导入的时候提示Got a packet bigger than 'max_allowed_packet' bytes

    Got a packet bigger than 'max_allowed_packet' bytes错误 默认可能是2M 把max_allowed_packet设置大于5M试试,我设置为160M,输 ...

  4. verilog 计算机网络 仿真 激励 pcap

    做verilog网络逻辑时,需要产生正确的数据包格式激励,手写激励真烦人,现在让testbench读取pcap文件,则可以精确还原数据包的bit与时序,省去了一大批麻烦 1.设计读取逻辑 `times ...

  5. 迷你MVVM框架 avalonjs 0.97发布

    在本版本中,王之三柱臣全部就位! mmRouter: https://github.com/RubyLouvre/mmRouter mmAnimate: https://github.com/Ruby ...

  6. BloomFilter

    [BloomFilter] 错误率估计.最优哗哈希函数个数.位数组的大小 尚未细看.以看补上. 参考:http://blog.csdn.net/jiaomeng/article/details/149 ...

  7. Python3 abs() 函数

    Python3 abs() 函数  Python3 数字 描述 abs() 函数返回数字的绝对值. 语法 以下是 abs() 方法的语法: abs( x ) 参数 x -- 数值表达式,可以是整数,浮 ...

  8. swagger框架

    1.1   介绍 Swagger是一个简单又强大的能为你的Restful风格的Api生成文档工具.在项目中集成这个工具,根据我们自己的配置信息能够自动为我们生成一个api文档展示页,可以在浏览器中直接 ...

  9. java 框架收藏

    一.java 异步非阻塞编程框架 1.Spring Webflux 2.Vert.x 3.Ratpack 4.smart-socket 国产异步框架 二.微服务框架 1.Jboot :专为大型分布式项 ...

  10. App启动页设计实例与技巧

    App启动页,也称闪屏页,最初是为缓解用户等待Web/iOS/Android App数据加载的焦虑情绪而出现,后被设计师巧妙用于品牌文化展示,服务特色介绍以及功能界面熟悉等平台进行设计,被赋予了更加丰 ...