gpt4 book ai didi

asp.net-mvc - 在电子邮件中发送asp.net MVC操作结果

转载 作者:行者123 更新时间:2023-12-03 11:41:14 24 4
gpt4 key购买 nike

我想在asp.net mvc中使用我的Action作为模板引擎,以字符串形式产生,可以发送电子邮件。

伪代码:

public ActionResult Register()
{
SendEmail(View().ToString());

return new EmptyResult();
}

最佳答案

首先,您仍然可能想从操作中返回 View ,因此返回EmptyResult并不是最好的方法。但是在注册过程中处理页面流时,您会发现这一点。

我假设您希望使用已经创建的View创建HTML电子邮件。这意味着您希望得到类似于以下内容的结果:

public ActionResult CreateEmailView(RegistrationInformation info)
{
var userInformation = Membership.CreateNewUserLol(info);
return View(userInformation)
}

并将其作为电子邮件的正文发送。您可以重用 View 和所有有趣的东西。

您可以通过创建自定义ActionResult并使用它来生成文本来利用该框架。

这是一些可能实际上可以编译和工作的类似于C#的伪代码。首先,自定义ActionResult:
public class StringResult : ViewResult
{
public string Html { get; set; }
public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (string.IsNullOrEmpty(this.ViewName))
{
this.ViewName =
context.RouteData.GetRequiredString("action");
}
ViewEngineResult result = null;
if (this.View == null)
{
result = this.FindView(context);
this.View = result.View;
}
ViewContext viewContext = new ViewContext(
context, this.View, this.ViewData, this.TempData);
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
{
// used to write to context.HttpContext.Response.Output
this.View.Render(viewContext, writer);
writer.Flush();
Html = Encoding.UTF8.GetString(stream.ToArray());
}
if (result != null)
{
result.ViewEngine.ReleaseView(context, this.View);
}
}
}

这将覆盖基本方法的ExecuteResult(这是我正在重写的基本方法中的代码;可能在RC1中已更改)以呈现为我控制的流,而不是Response的Output流。因此,它准确地拉出了文本将如何呈现给客户端计算机。

接下来,如何在 Controller 操作中使用它:
public ActionResult CreateEmailView(RegistrationInformation info)
{
var userInformation = Membership.CreateNewUserLol(info);
// grab our normal view so we can get some info out of it
var resultView = View(userInformation);

// create our string result and configure it
StringResult sr = new StringResult();
sr.ViewName = resultView.ViewName;
sr.MasterName = resultView.MasterName;
sr.ViewData = userInformation;
sr.TempData = resultView.TempData;
// let them eat cake
sr.ExecuteResult(this.ControllerContext);
string emailHtml = sr.Html;
// awesome utils package, dude
Utils.SendEmailKThx(userInformation, emailHtml);

return resultView;
}

我要渲染相同的 View 两次;第一次将其渲染为流,第二次正常渲染。可能有可能潜入其他地方的ViewResult的调用链中并更改Render的操作方式,但是粗略地看一下代码不会显示任何内容。虽然该框架相当不错,但流程中各个部分的调用堆栈不够细致,无法轻松地更改流程中的单个步骤。如果他们将ExecuteResult分解为几个不同的可重写方法,则可以将其从渲染到输出流更改为渲染到我们的流,而无需覆盖整个ExecuteResult方法。那好吧....

关于asp.net-mvc - 在电子邮件中发送asp.net MVC操作结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/520863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com