ASP.NET MVC渲染视图到字符串以进行电子邮件发送

And*_*ndy 7 asp.net-mvc asp.net-mvc-views asp.net-mvc-2

我想使用MVC视图来创建电子邮件的正文,我遇到过这个问题(http://www.brightmix.com/blog/renderpartial-to-string-in-asp-net-mvc/)但它没有似乎适用于强类型视图(ViewContext为null).但是我想要的东西可以呈现包括母版页在内的完整视图.

我想如果有一种方法只是调用一个没有重定向的视图,只是写一个不同的流并在控制器内发送可能会这样做的电子邮件,但我无法弄清楚如何调用一个视图.

任何建议都会很棒!

提前致谢.

Gifster

awr*_*ley 15

已经提出(并已回答)这个问题了:

将视图渲染为字符串

这是我使用的一点:

protected string RenderViewToString<T>(string viewPath, T model, System.Web.Mvc.ControllerContext controllerContext) {
        using (var writer = new StringWriter()) {
            var view = new WebFormView(viewPath);
            var vdd = new ViewDataDictionary<T>(model);
            var viewCxt = new ViewContext(controllerContext, view, vdd, new TempDataDictionary(), writer);
            viewCxt.View.Render(viewCxt, writer);
            return writer.ToString();
        }
    }
Run Code Online (Sandbox Code Playgroud)

此方法的最佳位置是您的mvc项目引用的类库项目.主要是因为这样您可以轻松地在所有应用中重复使用它.但也因为它既不是应用程序逻辑(因此不属于控制器)也不属于模型.有些东西只是公用事业.

请注意,要使其生效,viewPath参数必须是文件的物理路径,并带有.aspx扩展名.您不能使用路由,因为WebFormView类在其构造函数中需要物理路径.

这将呈现完整视图并考虑母版页.


HTML电子邮件的健康警告:

HTML电子邮件和您阅读它们的设备比网站和浏览器更难以设计.什么在一个工作,什么在另一个工作.所以使用HTML电子邮件,你真的必须保持简单!你的可爱页面包含菜单和相关图片以及其他任何内容,只能在所有电子邮件设备中使用.仅作为示例,图像src属性需要是绝对的并包括域:

这不起作用:

<img src="/Images/MyImage.gif" ... /> 
Run Code Online (Sandbox Code Playgroud)

这将是:

 <img src="http://www.mywebsite.com/Images/MyImage.gif" ... /> 
Run Code Online (Sandbox Code Playgroud)

有了这些警告,它工作正常,我使用它.只是不要试图向他们发送你的网站的完整噱头,cos将无法正常工作!

更重要的是:

所有CSS必须是INLINE并且仅用于基本样式:颜色,边框,填充.但没有漂浮和定位.CSS布局不能跨设备一致地工作!