2010-09-08 38 views
5

使用ASP.NET MVC视图引擎来呈现通过电子邮件发送的html会是一个好主意和可执行文件吗?使用ASP.NET MVC作为电子邮件模板引擎:好主意?

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

好主意?任何警告?例子 :) ?

+1

是的,伟大的工程 - 你会想看看这个:http://razorengine.codeplex.com/ – 2011-02-13 21:21:30

回答

4

是的,这是一个好主意,relatively easy to implement

+0

谢谢,异步行为呢?我不想分析和发送电子邮件来阻止页面请求。 – Bertvan 2010-09-08 07:49:51

+0

在这种情况下,您可以在新线程中执行此操作或使用AsyncController。 – 2010-09-08 07:59:48

+0

好吧,让我们看看这是否会工作:) – Bertvan 2010-09-08 08:14:46

1

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

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

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

+0

重新编译确实是最大的警告。这也是为什么,我们正在放弃这种方法并开始寻找XSLT ...... – Bertvan 2010-09-09 20:47:42

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

0

您可以使用MVCMailer NuGet - 它使用MVC视图模板,您只需编写一个单行代码来做到这一点!