使用Razor发送带模板MVC的电子邮件

问题描述:

我想从我的网站发送一些邮件。使用Razor发送带模板MVC的电子邮件

我创建了一个模板:OrderPlacedEmail.cshtml

@model OnlineCarStore.Models.PurchaseVM 

<h1>Order Placed Email Notification</h1> 
<p>@Model.Comments</p> 

Dear @Model.Name, 

<h2>Thank you.</h2> 
<p> 
You’ve made a purchase on <a href="">@Model.Comments</a> 
</p>....and so on... 

我创建一个视图模型,我用它是这样的:

var template = Server.MapPath("~/Templates/OrderPlaced.cshtml"); 
var viewModel = new PurchaseVM 
{ 
    GuId = new Guid(guidValue), 
    Name = name, 
    Address = address, 
    Phone = phone, 
    Email = email, 
    Comments = comments, 
    Date = DateTime.Now, 
    CartList = cartList 
}; 

var body = Razor.Parse(template, viewModel); 

我的理解,剃刀。解析方法,应该将我模板中的所有细节替换为视图模型中的值。但是,身体获取模板位置的值,如下所示:

enter image description here 您能否请告知我做错了什么。

如果你想有一个帮手,我使用

public static class HtmlOutputHelper 
{ 

    public static string RenderViewToString(ControllerContext context, 
           string viewPath, 
           object model = null, 
           bool partial = false) 
    { 
     // first find the ViewEngine for this view 
     ViewEngineResult viewEngineResult = null; 
     if (partial) 
      viewEngineResult = ViewEngines.Engines.FindPartialView(context, viewPath); 
     else 
      viewEngineResult = ViewEngines.Engines.FindView(context, viewPath, null); 

     if (viewEngineResult == null) 
      throw new FileNotFoundException("View cannot be found."); 

     // get the view and attach the model to view data 
     var view = viewEngineResult.View; 
     context.Controller.ViewData.Model = model; 

     string result = null; 

     using (var sw = new StringWriter()) 
     { 
      var ctx = new ViewContext(context, view, 
             context.Controller.ViewData, 
             context.Controller.TempData, 
             sw); 
      view.Render(ctx, sw); 
      result = sw.ToString(); 
     } 

     return result; 
    } 
} 

在您的控制器

var viewModel = new PurchaseVM 
{ 
    GuId = new Guid(guidValue), 
    Name = name, 
    Address = address, 
    Phone = phone, 
    Email = email, 
    Comments = comments, 
    Date = DateTime.Now, 
    CartList = cartList 
}; 

var emailTemplate = "~/Views/Templates/OrderPlaced.cshtml"; 
var emailOutput = HtmlOutputHelper.RenderViewToString(ControllerContext, emailTemplate, emailModel, false); 
+0

谢谢!它工作完美! :) – Orsi

您还可以使用ActionMailerNext LIB从的NuGet画廊对于这种情况。

public class EmailController : MailerBase 
{ 
//... 
    public EmailResult OrderPlaced(Order order) 
    { 
     MailAttributes.To.Add(new MailAddress("[email protected]")); 
     MailAttributes.From = new MailAddress("[email protected]"); 

     return Email("OrderPlaced", new PurchaseVM 
     { 
      //... 
     }); 
    } 
//... 
} 

您可以保持视图不变。