使用RazorGenerator和預編譯MVC引擎將Razor視圖編譯成DLL


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
View Code

步驟三:對生成的代碼進行修改

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/,所以可以直接不帶路徑的使用該視圖)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM