我想要一個用於電子郵件的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