我正在开发一个 ASP.NET MVC 应用程序,它将向用户发送一封确认电子邮件。对于电子邮件本身,我想创建一个视图,然后渲染该视图并使用 .NET 邮件对象发送它。
如何使用 MVC 框架做到这一点?
我正在开发一个 ASP.NET MVC 应用程序,它将向用户发送一封确认电子邮件。对于电子邮件本身,我想创建一个视图,然后渲染该视图并使用 .NET 邮件对象发送它。
如何使用 MVC 框架做到这一点?
你基本上需要使用IView.Render
. 您可以使用ViewEngineCollection.FindView
(ViewEngines.Engines.FindView
默认值) 来获取视图。将输出渲染到 aTextWriter
并确保ViewEngine.ReleaseView
之后调用。下面的示例代码(未经测试):
StringWriter output = new StringWriter();
string viewName = "Email";
string masterName = "";
ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, viewName, masterName);
ViewContext viewContext = new ViewContext(ControllerContext, result.View, viewData, tempData);
result.View.Render(viewContext, output);
result.ViewEngine.ReleaseView(ControllerContext, result.View);
string viewOutput = output.ToString();
我会把 viewData / tempData 留给你。
根据我对理查德回答的评论,这段代码确实有效,但它总是导致“发送 HTTP 标头后无法重定向”错误。
在对谷歌进行了大量挖掘并感到沮丧之后,我终于在这篇文章中找到了一些似乎可以解决问题的代码:
http://mikehadlow.blogspot.com/2008/06/mvc-framework-capturing-output-of-view_05.html
这家伙的方法是创建自己的HttpContext。
我没有使用 MVCContrib BlockRenderer,而是将当前的 HttpContext 替换为新的 HttpContext,该新的 HttpContext 承载写入 StringWriter 的响应。
这种方法效果很好(一个小的区别是我必须创建一个单独的动作来渲染我的局部视图,但那里没有戏剧性)。
这对我有用:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
namespace Profiteer.WebUI.Controllers
{
public class SampleController : Controller
{
public ActionResult Index()
{
RenderViewAsHtml(RouteData.Values["controller"].ToString(),
RouteData.Values["action"].ToString());
return View();
}
private void RenderViewAsHtml(string controllerName, string viewName)
{
var vEngine = (from ve in ViewEngineCollection
where ve.GetType() == typeof(RazorViewEngine)
select ve).FirstOrDefault();
if (vEngine != null)
{
var view =
vEngine.FindView(
ControllerContext,
viewName, "_Layout", false).View as RazorView;
if (view != null)
{
var outPath =
Server.MapPath(
string.Format("~/Views/{0}/{1}.html",
controllerName, viewName));
using (var sw = new StreamWriter(outPath, false))
{
var viewContext =
new ViewContext(ControllerContext,
view,
new ViewDataDictionary(),
new TempDataDictionary(),
sw);
view.Render(viewContext, sw);
}
}
}
}
}
}