2011-02-08 96 views
2

我想要一个用于电子邮件的html模板。我想传递一个模型,让它渲染并返回一个字符串变量。ASP.NET MVC将模型传递到没有controllerContext的html模板

我该如何做到这一点?我相信我可以使用随asp.net mvc提供的渲染。

我不想在我的控制器或使用controllercontext对象内执行此操作。

+1

我一直在尝试做这件事很长一段时间,我向你保证它可以完成,但解决方案并不容易,感觉有点“脏”。你有没有看过[NDjango](http://ndjango.org/index.php?title=Njjango_Home)或[DotLiquid](http://dotliquidmarkup.org/)作为替代方案? – 2011-02-08 16:01:19

+0

出于好奇,为什么不在控制器内部做? – Scott 2011-02-08 16:21:20

+0

@Scott,web服务可能会触发该方法发送电子邮件。 – 2011-02-08 17:02:04

回答

1

使用来自@Mitch Rosenburg的评论作为答案:

我正在使用DotLiquid模板。

0

我自己并没有尝试过,但是我找到了一个名为Postal的库,我打算在自己的应用中使用这个库。

0

你可以像在下面的方法:

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); 

其中模式是您要发送到模型你的'模板'

0

我不得不一次做同样的事情,最后我使用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(); 
} 

希望它可以帮助别人。