他们的解决方案是使用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),但是使用更多代码几乎可以完成相同的操作。

另一方面,我正在寻找一种可以渲染View而无需POST / GET并为我生成一个可以通过我的Email代码发送的简单字符串的东西。
不会出错的东西,例如两次发布标题或伪造某些数据。

EX:
//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或弄乱路由数据!
  • 它可以实现Header / Footer以允许模板!
  • 您可以使用循环,条件等...
  • 整洁,重量轻,特别是如果您打算完全移动以激发 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/

    10-12 00:01
    查看更多