【发布时间】:2013-02-28 13:47:42
【问题描述】:
我想使用我的 Razor 视图作为某种模板来发送电子邮件, 所以我想将我的模板“保存”在视图中,将其作为字符串读入控制器,进行一些必要的替换,然后发送。
我有一个可行的解决方案:我的模板作为 HTML 页面托管在某处,但我想将它放入我的应用程序中(即在我看来)。我不知道如何在控制器中将视图读取为字符串。
【问题讨论】:
标签: c# .net asp.net-mvc asp.net-mvc-3 razor
我想使用我的 Razor 视图作为某种模板来发送电子邮件, 所以我想将我的模板“保存”在视图中,将其作为字符串读入控制器,进行一些必要的替换,然后发送。
我有一个可行的解决方案:我的模板作为 HTML 页面托管在某处,但我想将它放入我的应用程序中(即在我看来)。我不知道如何在控制器中将视图读取为字符串。
【问题讨论】:
标签: c# .net asp.net-mvc asp.net-mvc-3 razor
我使用以下内容。如果有的话,把它放在你的基本控制器上,这样你就可以在所有控制器中访问它。
public static string RenderPartialToString(Controller controller, string viewName, object model)
{
controller.ViewData.Model = model;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
【讨论】:
看看RazorEngine 库,它完全符合您的要求。我以前用它做电子邮件模板,效果很好。
你可以这样做:
// Read in your template from anywhere (database, file system, etc.)
var bodyTemplate = GetEmailBodyTemplate();
// Substitute variables using Razor
var model = new { Name = "John Doe", OtherVar = "Hello!" };
var emailBody = Razor.Parse(bodytemplate, model);
// Send email
SendEmail(address, emailBody);
【讨论】:
Microsoft.AspNet.Razor 做类似的事情?只是想在微软内部解决问题,这样我就不必证明另一个依赖是合理的。