c# - ASP.NET MVC 电子邮件

标签 c# asp.net-mvc email templates spark-view-engine

他们的解决方案是使用 ASP.NET MVC View 生成电子邮件模板,而无需费力。

让我详细说明跳圈。

var fakeContext = new HttpContext(HttpContext.Current.Request, fakeResponse);
var oldContext = HttpContext.Current;
HttpContext.Current = fakeContext;
var html = new HtmlHelper(new ViewContext(fakeControllerContext,
  new FakeView(), viewDataDictionary, new TempDataDictionary()),
  new ViewPage());
html.RenderPartial(viewName, viewData, viewDataDictionary);
HttpContext.Current = oldContext;

上面的代码是使用当前的 HttpContext 来伪造一个新的 Context 并使用 RenderPartial 渲染页面,我们不应该这样做。

另一个使用 ControllerContext 和 .Render 的非常详细的解决方案: ( IEmailTemplateService, Headers/Postback WorkAround ) 但几乎用更多的代码做同样的事情。

另一方面,我正在寻找一种无需 POST/GET 即可呈现 View 并生成一个简单字符串的东西,我可以通过我的电子邮件代码发送该字符串。 不会遇到错误的事情,例如两次发布标题或伪造一些数据。

例子:

//code which does not fire Render, RenderPartial... etc
var email = emailFramework.Create(viewData, view); 

查看下面我的解决方案或点击此链接:

我使用 spark 的解决方案:(12/30/2009) ASP.NET MVC Email Template Solution

最佳答案

这是我想要 ASP.NET MVC ViewEngine 做的,但它在 Spark 中,只需点击下面的最新链接,

更新 (12/30/2009) 清洁版: ASP.NET MVC Email Template Solution


(11/16/2009) 或者,Louis DeJardin 控制台应用程序版本:

using System;
using Spark;
using Spark.FileSystem;

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public abstract class EmailView : AbstractSparkView
{
    public User user { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        // following are one-time steps

        // create engine
        var settings = new SparkSettings()
            .SetPageBaseType(typeof(EmailView));

        var templates = new InMemoryViewFolder();
        var engine = new SparkViewEngine(settings)
                     {
                         ViewFolder = templates
                     };

        // add templates
        templates.Add("sample.spark", @"Dear ${user.Name}, This is an email.Sincerely, Spark View Engine http://constanto.org/unsubscribe/${user.Id}");

        // following are per-render steps

        // render template
        var descriptor = new SparkViewDescriptor()
            .AddTemplate("sample.spark");

        var view = (EmailView)engine.CreateInstance(descriptor);
        view.user = new User { Id = 655321, Name = "Alex" };
        view.RenderView(Console.Out);
        Console.ReadLine();
    }
}

我决定使用这种方法,因为它似乎是正确的方法,它:

  • 不使用任何 HttpContext/ControllerContext 或弄乱路由数据!
  • 它可以实现页眉/页脚以允许模板!
  • 您可以使用循环、条件等...
  • 它干净、重量轻,特别是如果您打算完全迁移到 Spark View 引擎!

请务必阅读这些帖子。 Louis DeJardin 的全部功劳请参阅他的教程 :) Using Spark as a general purpose template engine! , Email Templates Revisited

关于c# - ASP.NET MVC 电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1730134/

相关文章:

c# - 如何将字符串转换为 XML 格式

c# - 在 C# 中保护加密 key

asp.net-mvc - 如何在ASP.NET MVC中添加到动态robots.txt的路由?

android - 如何通过电子邮件中的自定义 URL 启动我的应用程序

c# - MVC C# 多个异步 ajax 调用

c# - 如果在 C# 中收到新的 Outlook 邮件,则启动方法

c# - MVC3 可选模型属性

asp.net-mvc - 使用 Ninject 将存储库注入(inject)自定义成员提供程序

python - 谷歌应用引擎 Python Cron

c# - 通过 C# 通过 Thunderbird 一次发送多封电子邮件