我想要一个用于电子邮件的html模板。我想传递一个模型,让它渲染并返回一个字符串变量。ASP.NET MVC将模型传递到没有controllerContext的html模板
我该如何做到这一点?我相信我可以使用随asp.net mvc提供的渲染。
我不想在我的控制器或使用controllercontext对象内执行此操作。
我想要一个用于电子邮件的html模板。我想传递一个模型,让它渲染并返回一个字符串变量。ASP.NET MVC将模型传递到没有controllerContext的html模板
我该如何做到这一点?我相信我可以使用随asp.net mvc提供的渲染。
我不想在我的控制器或使用controllercontext对象内执行此操作。
使用来自@Mitch Rosenburg的评论作为答案:
我正在使用DotLiquid模板。
我自己并没有尝试过,但是我找到了一个名为Postal的库,我打算在自己的应用中使用这个库。
你可以像在下面的方法:
private string ViewToString(string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
viewName = ControllerContext.RouteData.GetRequiredString("action");
ViewData.Model = model;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
而在你的操作方法,你可以使用它像这样
ViewToString("Index", model);
其中模式是您要发送到模型你的'模板'
我不得不一次做同样的事情,最后我使用HttpWebRequest来呈现视图并将结果捕获为一个字符串。
这个解决方案带来了一系列其他问题(获取授权cookie,通过我们的自定义URL安全层供电等),它感觉效率低下和草率,但截止日期是截止日期,对吗?
代码看起来是这样的:
public string GetEmailBody(string url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(responseStream);
return streamReader.ReadToEnd();
}
希望它可以帮助别人。
我一直在尝试做这件事很长一段时间,我向你保证它可以完成,但解决方案并不容易,感觉有点“脏”。你有没有看过[NDjango](http://ndjango.org/index.php?title=Njjango_Home)或[DotLiquid](http://dotliquidmarkup.org/)作为替代方案? – 2011-02-08 16:01:19
出于好奇,为什么不在控制器内部做? – Scott 2011-02-08 16:21:20
@Scott,web服务可能会触发该方法发送电子邮件。 – 2011-02-08 17:02:04