7

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

我认为,如果有一种方法可以调用视图而无需重定向,只需写入不同的流并在控制器中发送电子邮件就可以了,但我不知道如何调用视图。

任何建议都会很棒!

提前致谢。

吉夫斯特

4

2 回答 2

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

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

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

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


HTML 电子邮件的健康警告:

HTML 电子邮件和您阅读它们的设备比网站和浏览器的设计更加困难和限制。在一个中起作用的东西,在另一个中不起作用。因此,对于 html 电子邮件,您真的必须保持简单!您可爱的页面包含菜单和相关图像以及其他任何内容,但不适用于所有电子邮件设备。举个例子,images src 属性需要是绝对的并且包含域:

这不起作用:

<img src="/Images/MyImage.gif" ... /> 

这将:

 <img src="http://www.mywebsite.com/Images/MyImage.gif" ... /> 

有了这些警告,它工作正常,我使用它。只是不要试图向他们发送您网站的全部噱头,因为那是行不通的!

更重要的是:

所有 CSS 都必须是内联的,并且仅用于基本样式:颜色、边框、填充。但没有浮动和定位。CSS 布局不会跨设备一致地工作!

于 2010-11-12T11:10:44.717 回答
4

您可以使用 MvcView NuGet 包来执行此操作!它很简单,只需使用 install-package MvcMailer 安装即可!使用视图引擎的全部功能来模板、母版页、视图模型并巧妙地发送 html 电子邮件!

于 2011-01-12T23:33:33.123 回答