使用ASP.NET MVC作为电子邮件模板引擎:好主意吗?

5

使用ASP.NET MVC视图引擎渲染HTML并通过电子邮件发送是否是一个好的想法且可行的呢?

我知道可以让视图渲染成字符串。因此,可以用它来构建邮件消息。 由于应用程序已经在使用ASP.NET MVC,所以我可以使用所有实用的ASP.NET MVC内容,而不必使用Brail或NVelocity来创建我的“邮件视图”。

这是个好主意吗?有什么注意事项吗?可以给一些例子吗?


1
没错,非常好用 - 你会想要看一下这个:http://razorengine.codeplex.com/ - 3Dave
4个回答

4

谢谢,那异步行为怎么办?我不想让解析和发送电子邮件阻塞页面请求。 - Bertvan
在这种情况下,您可以在新线程中执行此操作或使用AsyncController。 - Darin Dimitrov

1
这是我的版本的RenderPartialToString扩展方法(还负责处理路径等):
public static class ExtensionMethods
{
    public static string RenderPartialToString(this ControllerBase controller, string partialName, object model)
    {
        var vd = new ViewDataDictionary(controller.ViewData);
        var vp = new ViewPage
        {
            ViewData = vd,
            ViewContext = new ViewContext(),
            Url = new UrlHelper(controller.ControllerContext.RequestContext)
        };

        ViewEngineResult result = ViewEngines
                                  .Engines
                                  .FindPartialView(controller.ControllerContext, partialName);

        if (result.View == null)
        {
            throw new InvalidOperationException(
            string.Format("The partial view '{0}' could not be found", partialName));
        }
        var partialPath = ((WebFormView)result.View).ViewPath;

        vp.ViewData.Model = model;

        Control control = vp.LoadControl(partialPath);
        vp.Controls.Add(control);

        var sb = new StringBuilder();

        using (var sw = new StringWriter(sb))
        {
            using (var tw = new HtmlTextWriter(sw))
            {
                vp.RenderControl(tw);
            }
        }
        return sb.ToString();
    }
}

用法:

return this.RenderPartialToString("YourPartialView", yourModel);

希望这可以帮到你。
Jim

1

我个人认为这是一个好主意。绝对比将带有占位符的标记放入数据库中要好。

缺点是您需要使用Visual Studio来编辑这些模板,然后重新编译和部署项目。您将无法将模板的工作外包给其他非技术人员。

是的,添加新模板也需要您的个人干预。


重新编译确实是最大的缺点。这也是为什么我们正在放弃这种方法,开始寻找XSLT的原因... - Bertvan

0
你可以使用MVCMailer NuGet - 它使用MVC视图模板,您只需编写一行代码即可完成此操作!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接