zoukankan      html  css  js  c++  java
  • 使用Razor视图引擎来生成邮件内容

    邮件的内容其实是就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

  • 相关阅读:
    常用SQL语句
    一个很准的心理测试
    视图,存储实现行列转换
    『原创』+『转载』配置模拟器网络环境(访问局域网)Step by Step!
    『原创』老范的XML文档编辑程序——不是一般的山寨!(原创附程序)
    『原创』+『参考』基于PPC的图像对比程序——使用直方图度量
    『原创』.Net CF下ListView的数据绑定
    『原创』+『参考』使用C#在PPC的Today界面上的任务栏加入应用程序图标
    关于RDA远程访问数据库的一个例子(亲手完成,不容易啊)
    『原创』+『参考』亲手实验:使用C#在PPC中播放声音
  • 原文地址:https://www.cnblogs.com/seriawei/p/7466561.html
Copyright © 2011-2022 走看看