将ASP.NET MVC视图呈现为字符串以便通过电子邮件发送

7
我想使用MVC视图创建电子邮件正文,我发现这个(http://www.brightmix.com/blog/renderpartial-to-string-in-asp-net-mvc/),但它似乎无法与强类型视图一起使用(ViewContext为空)。但我想要的是渲染包括主页面在内的完整视图。
我认为,如果有一种方法可以调用视图而不需要重定向,并且只需写入不同的流并在控制器中发送电子邮件,那么可能会做到这一点,但我无法弄清如何调用视图。
任何建议都将是很棒的!
提前感谢。
Gifster

可能是将视图呈现为字符串的重复问题。 - Matt Hinze
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电子邮件中,您真的需要保持简单!您可爱的页面与菜单、相对图像和其他任何东西,在所有电子邮件设备中都不起作用。仅以一个例子为例,图像src属性需要是绝对的,并包括域名:

这不起作用:

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

这将会:

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

在遵守这些注意事项的前提下,它能够正常工作并且我使用过。但是不要尝试发送你网站的全部花哨内容,因为那样不会起作用!

更重要的是:

所有CSS必须是内联的,并且仅适用于基本样式:颜色、边框、填充。但是不要使用浮动和定位。CSS布局在不同设备上无法保持一致性!


嗨,你好!我对电子邮件HTML非常熟悉,只是对MVC比较新手。我有一个EmailController控制器,并且它有一个Welcome方法,这个方法应该放在那个控制器里呢?还是放在其他地方? - Andy
@Andy:这个健康警告也适用于后来的任何人。严格来说,这不是应用程序逻辑,因此不应该出现在控制器中。它也不是模型的一部分。由于它是可重用功能,我会将该方法设置为静态,并将其放入库项目中的静态类中。这样,通过将dll文件放入bin文件夹中,它就可以在所有应用程序中重复使用。 - awrigley
所以在这里我需要通过ControllerContext传递吗?new ViewContext(ControllerContext, view, vdd, new TempDataDictionary(), writer); - Andy
1
如果你正在使用Razor,至少可以这样做:var view = new RazorViewEngine().FindView(controllerContext, viewName, masterPageName),然后在创建ViewContext时将view.View作为第二个参数传递,以避免查找视图和母版页面时出现物理路径问题。 - DaveD
如果您正在使用DOS应用程序而不是MVC应用程序,那么您从哪里获取controllerContext呢? - johnstaveley

4

您可以使用MvcView NuGet包来实现这一点!它很简单,只需使用install-package MvcMailer进行安装即可!充分利用视图引擎的模板、主页、视图模型和整洁地发送HTML电子邮件!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接