在 Web 项目之外使用 Razor

2024-01-05

我想使用 Razor 视图引擎生成电子邮件。

根据我所读到的内容,我可以使用这些操作系统项目从我的网站上做到这一点:

  • Postal http://aboutcode.net/postal/
  • ActionMailer.Net http://geeksharp.com/2011/01/26/actionmailer-net-email-templates-for-the-mvc-crowd/
  • Mvc邮件程序 http://www.codeproject.com/KB/aspnet/MvcMailerNuGet.aspx

然而,所有这些都使用用户提交表单并从控制器发送电子邮件的示例。创建电子邮件时似乎需要 ControllerContext。我希望定期在“服务”层中进行生成,所以我怀疑我是否有权访问 ControllerContext。

这可行吗?


Check this http://razorengine.codeplex.com/出去。我将它与模板一起用作嵌入资源,如下所示(但可以修改以在任何地方找到模板):

public static class MailSender
{
    static MailSender()
    {
        CompilerServiceFactory = new DefaultCompilerServiceFactory();
        TemplateService = new TemplateService(CompilerServiceFactory.CreateCompilerService(), typeof(MailTemplate<>));
    }

    private static ICompilerServiceFactory CompilerServiceFactory { get; set; }
    private static TemplateService TemplateService { get; set; }

    private static ITemplate<T> GetTemplate<T>(T model)
    {
        string path = typeof(T).FullName;

        var assembly = Assembly.GetExecutingAssembly();

        using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(path))
        {
            if (stream == null)
                throw new FileNotFoundException("Mail template not found");

            using (var reader = new StreamReader(stream))
            {
                string source = reader.ReadToEnd();

                return TemplateService.GetTemplate<T>(source, model);
            }
        }
    }

    public static void Send<T>(string to, T model)
    {
        Send(new string[] { to }, new string[] { }, new string[] { }, model);
    }
    public static void Send<T>(string to, string cc, string bcc, T model)
    {
        Send(new string[] { to }, new string[] { cc }, new string[] { bcc }, model);
    }
    public static void Send<T>(string[] to, string[] cc, string[] bcc, T model)
    {
        var template = (MailTemplate<T>)GetTemplate<T>(model);

        template.Execute();

        Trace.WriteLine(string.Format("To: {0} Subject: {1}{3}Body: {2}", string.Join(",", to), template.Subject, template.Result, Environment.NewLine), "Mail");
#if !LOCAL
        using (var message = new MailMessage())
        using (var client = new SmtpClient())
        {
            if (!string.IsNullOrWhiteSpace(template.From))
                message.From = new MailAddress(template.From);

            message.To.Add(string.Join(",", to));

            if (cc != null && cc.Length > 0)
                message.CC.Add(string.Join(",", cc));

            if (bcc != null && bcc.Length > 0)
                message.Bcc.Add(string.Join(",", bcc));

            message.Subject = template.Subject;

            message.Body = template.Result;
            message.IsBodyHtml = true;

            client.Send(message);
        }
#endif
    }
}

public abstract class MailTemplate<TModel> : TemplateBase<TModel>
{
    public string From { get; set; }
    public string Subject { get; set; }
}

model:

public class Contact
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Text { get; set; }
}

模板:

@inherits Feedback.Lib.Mail.MailTemplate<Feedback.Lib.Mail.Templates.Contact>
@{
    From = string.Format("{0} <{1}>", Model.Name, Model.Email);
    Subject = "Contact request - " + From; 
}

@Model.Text

我为每个模板都有自己的模型,因此很容易通过类名找到它们。我也无法使智能感知工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Web 项目之外使用 Razor 的相关文章

  • 您如何填充/验证您的 ViewModel?

    我很好奇人们构建 ViewModel 的各种方式以及他们为什么选择该方法 我在这里可以想到几种方法 1 注入存储库 控制器加载模型并映射到 ViewModel 这里 ViewModel 构造函数可以采用各种集合来进行内部设置 在选择列表中
  • Razor 与 ASPX 语法的比较 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近 我开始研究 MVC3 和 Razor 并阅读了几篇有关这些主题的文章 以更好地理解这个概念 我一直在读Scott Guthrie 的博客文
  • 将 MVC2 升级到 MVC3 - 仅在服务器上出现问题 [已关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我已使用此
  • C# html-helper 扩展现有方法而不覆盖?

    我已经搜索过这个问题并发现可能answer https stackoverflow com questions 11232041 how to create an html helper to extend textboxfor to ad
  • 为什么我找不到 RadioButtonFor 方法?

    这是我的静态类 using System using System Collections Generic using System Linq using System Web Mvc using System Linq Expressio
  • 为什么MVC视图需要存在于View目录中才能工作?

    我一直在编写一个cms 使用MVC作为生成页面的主要引擎 我进展顺利 但希望能够为每个站点甚至每个视图创建一个独特的剃刀模板 如果需要的话 我的规则是每个项目都必须有一个与 URL 链接的唯一代码 每个项目站点的资产都按照位置与项目相关的方
  • Kendo UI 网格 - 显示行号

    如何在 Kendo UI 网格中显示行号 我的代码不起作用 页面显示该列 但它是空的 int counter 1 Html Kendo Grid
  • ASP.Net MVC:如何在 CSS 文件中使用 razor 变量

    根据我的场景 我需要存储这个路径 img 产品 pngrazor 变量中的图像 后来我想在 CSS 文件中使用该 razor 变量 下面的css代码在css文件中 test background url img product png no
  • 更新标记实体日期时间属性不变时

    我的域模型中有此实体服务 具有两个日期时间类型属性entrydate 和updatedon 当编辑视图中的用户进行任何更改并提交表单时 我希望将回发 修改对象的entrydate属性标记为未更改 以便在执行更新时不能覆盖entrydate
  • 使用编辑器模板处理可为空类型

    我开发了一个编辑器模板 它采用布尔类型并创建一个下拉列表 以更改true and false默认值 进入Si and No 现在 当我部署该应用程序时 我没有意识到boolean and Nullable
  • 在 Asp.Net Core 上的 Razor 页面中检查登录用户 AuthorizePolicy

    我正在寻找这个的变体 if SignInManager IsSignedIn User User IsInRole Roles Administrator div 但我不是在角色之后检查 而是在检查策略之后 就像在控制器中这样做一样 Aut
  • MVC中如何对数据进行加密和解密?

    In my MVC应用我想要encrypt and decrypt数据从视图到控制器的数据传输 如何执行此操作MVC 4 using Razor 您不需要加密从控制器到视图的数据 因为视图渲染发生在控制器正在操作的同一台计算机中 如果您想加
  • MVC 3 Razor,具有自定义标记/部分的助手

    我什至不确定这是否可行 但我想我会检查一下是否有任何方法可以使这变得更容易 首先 我的网站中有一些重复的标记 如下所示 div class module h3 Title h3 div p Information goes here p d
  • 剃刀 2 到剃刀 3 MVC 5

    我一直在开发 MVC 4 解决方案 并且一直在尝试将其升级到 MVC 5 我已按照概述的步骤操作here http www asp net mvc tutorials mvc 5 how to upgrade an aspnet mvc 4
  • 如何将值从控制器传递到asp.net中的视图?

    我正在开发一个应用程序 我需要将用户名的值从控制器传递到视图 我尝试了 ViewData 中给出的http msdn microsoft com en us library system web mvc viewdatadictionary
  • MVC 4 IntelliSense 无法在 Visual Studio 2010 的 Razor 中工作

    我将 Visual Studio 2010 与 ASP NET MVC4 一起使用 并且 IntelliSense for Razor 语法在应用程序的视图中对我不起作用 我能做些什么 还引用自 http sebnilsson com 10
  • 将 MVVM 与 Knockout.js 结合使用时在服务器端定义模型

    我计划在客户端使用 knockout js 和 MVVM 模式来构建单页应用程序 因此模型 视图模型将在客户端定义 我对如何在服务器端构建感到困惑 现在 控制器会返回域模型本身吗 从域模型到 ViewModel 的所有映射仅发生在客户端吗
  • 如何在 Razor 视图引擎中注册程序集

    我如何将其插入剃刀视图页面
  • ASP.Net MVC 3,复杂对象和延迟加载

    首先 我是 ASP Net MVC 3 的新手 而且我也在使用 EF 4 1 我有一个复杂的对象 类似于包含类别对象的产品对象 所以我们有 Product CategoryId Product Category 和一些额外的属性 我还有一个
  • Visual Studio 智能感知搞砸了

    所以我是 MVC4 和 C 的新手 我已经设计这个网站大约两周了 智能感知没有任何问题 两天来 Visual studio 告诉我 Viewbag 和其他 命令不是我的项目的一部分 我可能错过了一些东西 或者它告诉我 Viewbag 在当前

随机推荐