使用Razor視圖引擎來生成郵件內容

来源:http://www.cnblogs.com/seriawei/archive/2017/09/02/7466561.html
-Advertisement-
Play Games

郵件的內容其實是就HTML,傳統的做法都是通過在程式中拼接字元串來生成郵件的內容,生成困難,維護也困難。Razor是MVC裡面使用的視圖引擎,用來生成HTML非常方便,ZKEACMS中就是使用了Razor視圖引擎,用cshtml作為郵件模板來生成郵件內容。這樣很方便維護和修改。 ...


郵件的內容其實是就HTML,傳統的做法都是通過在程式中拼接字元串來生成郵件的內容,生成困難,維護也困難。Razor是MVC裡面使用的視圖引擎,用來生成HTML非常方便,ZKEACMS中就是使用了Razor視圖引擎,用cshtml作為郵件模板來生成郵件內容。這樣很方便維護和修改。

定義介面 IViewRenderService

介面中定義了兩個方法,第一個是視圖中沒有使用ViewModel,直接傳入視圖路徑就可以了。第二個是視圖中有作用ViewModel,傳入視圖路徑和ViewModel對象就可以。

namespace Easy.Mvc.RazorPages
{
    public interface IViewRenderService
    {
        string Render(string viewPath);
        string Render<Model>(string viewPath, Model model);
    }
}

介面實現 ViewRenderService

實現的方式也比較簡單,主要還是直接使用了RazorViewEngine:

namespace Easy.Mvc.RazorPages
{
    public class ViewRenderService : IViewRenderService
    {
        private readonly IRazorViewEngine _viewEngine;
        private readonly ITempDataProvider _tempDataProvider;
        private readonly IServiceProvider _serviceProvider;

        public ViewRenderService(IRazorViewEngine viewEngine, ITempDataProvider tempDataProvider,
            IServiceProvider serviceProvider)
        {
            _viewEngine = viewEngine;
            _tempDataProvider = tempDataProvider;
            _serviceProvider = serviceProvider;
        }
        public string Render(string viewPath)
        {
            return Render(viewPath, string.Empty);
        }
        public string Render<TModel>(string viewPath, TModel model)
        {
            var httpContext = new DefaultHttpContext { RequestServices = _serviceProvider };
            var actionContext = new ActionContext(httpContext, new RouteData(), new ActionDescriptor());

            var viewResult = _viewEngine.GetView(null, viewPath, false);
            if (!viewResult.Success)
            {
                throw new InvalidOperationException($"找不到視圖模板 {viewPath}");
            }

            var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary())
            {
                Model = model
            };

            using (var writer = new StringWriter())
            {
                var viewContext = new ViewContext(
                     actionContext,
                     viewResult.View,
                     viewDictionary,
                     new TempDataDictionary(actionContext.HttpContext, _tempDataProvider),
                     writer,
                     new HtmlHelperOptions()
                 );
                var render = viewResult.View.RenderAsync(viewContext);
                render.Wait();
                return writer.ToString();
            }
        }
    }
}

使用

使用的方法也很簡單,首先要先建一個郵件模板,例如 ResetPassword.cshtml

 

代碼如下:

@model ZKEACMS.Notification.ViewModels.ResetPasswordViewModel
<!DOCTYPE html>
<html class="not-ie" lang="zh">
<head>
 <title>重置密碼</title>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <meta charset="utf-8" />
 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
</head>
<body>
 <h3>
 您正在重置密碼,
 </h3>
 <p>
 您可以使用以下鏈接來重置您的密碼,為了安全,該鏈接僅會在一段時間內有效,請儘快重置密碼
 </p>
 <p>
 <a href="@Model.Link">
 @Model.Link
 </a>
 </p>
 <h4>
 ZKEASOFT
 </h4>
 <p>
 <a href="http://www.zkea.net">
 http://www.zkea.net
 </a>
 </p>
 <p>
 <em>@DateTime.Now.ToString("yyyy-MM-dd")</em>
 </p>
</body>
</html>

接下來就是調用ViewRenderService

var htmlContent = _viewRenderService.Render("~/EmailTemplates/ResetPassword.cshtml", new ResetPasswordViewModel{Link=...});

有了內容以後,就可以直接調用發送了。

原文鏈接:http://www.zkea.net/codesnippet/detail/post-62


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Socket():創建套接字 Bind():綁定套接字。將一個本地協議地址賦予一個套接字 Listen():監聽套接字 Connect():建立與伺服器之間的連接。 accept():接收連接, Send():發送函數 recv():接收函數 close():關閉連接 伺服器端順序: Socket( ...
  • 版本: 主機:Windows 7 64位旗艦版 虛擬機: VMWare 12 + Windows 7 64位旗艦版 VMWare pro 12 + Ubuntu16.04LTS 64位 註:由於VMWare 10 跟 Ubuntu 16.04LTS版本不相容,會出現VMWare Tools 安裝過程 ...
  • 在 ASP.NET 中,我們知道,它有一個面向切麵的請求管道,有19個主要的事件構成,能夠讓我們進行靈活的擴展。通常是在 web.config 中通過註冊 HttpModule 來實現對請求管道事件監聽,並通過 HttpHandler 進入到我們的應用程式中。而在 ASP.NET Core 中,對請 ...
  • 有時候,我們運營的公眾號,可能因為某些原因而需要更換公眾號,比如,公司被收購,公眾號轉讓等。 那原有公眾號的粉絲,我們自然也想讓其遷移到新的公眾號上,一般做法是通過微信自帶的粉絲轉移功能。 但流程也不少,還要交300元的審核費用。最要命的是,如果你的公眾號平臺提供了一些系統,那麼用戶在系統上的資料是 ...
  • 寫在前面整個項目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp這一節內容可能會用到的庫文件有 Measurement 和 TestCase,同樣在 Github 上可以找到。善用 Ctrl + F... ...
  • 平常經常用到虛擬機,每次從gho轉換為vmdk時都要輸入cmd代碼,覺得麻煩,自己動手做了個gho2vmdk轉換工具,集成ghost32.exe文件,可以一鍵轉換,省時省事。運行時會將ghost32.exe保存到Program FIles文件夾里,運行完自動刪除ghost32.exe。覺得還不錯,在 ...
  • 今天又到了搶火車票的時候,反正是每次搶票都是傻眼。於是寫個小工具幫助自己查詢火車票,如果有票的話給自己發個郵件提示購買。 一、準備工作 利用firebug等工具,我們可以獲取到當我們單擊查詢時調用的Get請求。 請求地址: https://kyfw.12306.cn/otn/leftTicket/q ...
  • 在很多場合,我們需要線上編輯HTML內容,然後在頁面上或者其他終端上(如小程式、APP應用等)顯示,編輯HTML內容的插件有很多,本篇介紹基於Bootstrap的 summernote插件實現HTML文檔的編輯和圖片插入操作,這個控制項的使用非常方便,並且用戶群也很大。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...