博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用RazorGenerator和预编译MVC引擎将Razor视图编译成DLL
阅读量:6264 次
发布时间:2019-06-22

本文共 4633 字,大约阅读时间需要 15 分钟。

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;}
@foreach (var item in Model.Modules) {
@item
}
@Model.UserName
视图代码

保存,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//------------------------------------------------------------------------------// 
// 此代码由工具生成。// 运行时版本:4.0.30319.42000//// 对此文件的更改可能会导致不正确的行为,并且如果// 重新生成代码,这些更改将会丢失。//
//------------------------------------------------------------------------------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
{ public _Views_Share_TopBar_cshtml() { } public override void Execute() { #line 2 "..\..\Views\Share\TopBar.cshtml" Layout = null; #line default #line hiddenWriteLiteral("\r\n
.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; }
\r\n
我是logo\r\n
\r\n");WriteLiteral(" "); #line 46 "..\..\Views\Share\TopBar.cshtml" Write(Model.UserName); #line default #line hiddenWriteLiteral("\r\n \r\n
\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 hiddenWriteLiteral("
"); #line 51 "..\..\Views\Share\TopBar.cshtml" Write(item); #line default #line hiddenWriteLiteral("
\r\n"); #line 52 "..\..\Views\Share\TopBar.cshtml" } #line default #line hiddenWriteLiteral(" \r\n\r\n\r\n"); } }}#pragma warning restore 1591
View Code

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

TopBar.generated.cs 自动生成的代码有两处不如人意的地方,需要我们对它进行修改,

修改过后不要再去操作TopBar.chhtml,否则我们的修改的内容将会被覆盖。

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

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

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

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

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

效果展示及代码下载

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

 

转载于:https://www.cnblogs.com/xurongjian/p/6915387.html

你可能感兴趣的文章
常用的本地存储——cookie篇
查看>>
react基于webpack和Babel 6上的开发环境搭建
查看>>
DevOps 发展融合运维可视化
查看>>
jQuery 3.0 beta 发布
查看>>
深入理解JavaScript系列7:S.O.L.I.D五大原则之开闭原则
查看>>
ES6 新特性之箭头函数
查看>>
回溯法解决N皇后问题(以四皇后为例)
查看>>
Nginx 学习笔记(一)
查看>>
CSS基础篇--CSS3之box-flex属性的使用
查看>>
Laravel 5系列教程七:表单验证 Validation
查看>>
地铁译:Spark for python developers --- 搭建Spark虚拟环境1 ...
查看>>
Git仓库配置
查看>>
ARM版Docker安装实战
查看>>
【阿里内部应用】基于Blink构建亲听项目以及全链路debug项目实时响应能力 ...
查看>>
MyBatis初学
查看>>
企业挖角 AI 教授是不是「原罪」?
查看>>
Nginx 配置学习笔记
查看>>
Flask 教程 第八章:粉丝
查看>>
HanLP中文分词Lucene插件
查看>>
解决Oracle死锁问题
查看>>