使用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);
我的理解,剃刀。解析方法,应该将我模板中的所有细节替换为视图模型中的值。但是,身体获取模板位置的值,如下所示:
答
如果你想有一个帮手,我使用
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);
答
您还可以使用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
{
//...
});
}
//...
}
您可以保持视图不变。
谢谢!它工作完美! :) – Orsi