加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 发送asp.net mvc动作结果里面的电子邮件

发布时间:2020-12-15 18:37:20 所属栏目:asp.Net 来源:网络整理
导读:我想在asp.net mvc中使用我的Action作为模板引擎,导致字符串的形式,我可以通过电子邮件发送。 伪代码: public ActionResult Register(){ SendEmail(View().ToString()); return new EmptyResult();} 解决方法 首先,您仍然可能希望从您的操作返回一个视图
我想在asp.net mvc中使用我的Action作为模板引擎,导致字符串的形式,我可以通过电子邮件发送。

伪代码:

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

    return new EmptyResult();
}

解决方法

首先,您仍然可能希望从您的操作返回一个视图,因此返回一个EmptyResult不是最好的;但是,当您在注册过程中处理页面流时,您会得出结论。

我假设您希望使用您已经创建的View创建一个HTML电子邮件。这意味着你希望得到如下结果:

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

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

您可以通过创建自定义的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中可能已更改),以呈现到我控制的流而不是响应的输出流。所以它将文本精确地拉出给客户端机器。

接下来,如何在控制器操作中使用它:

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

我正在渲染相同的视图两次;我第一次把它渲染到一个流,第二次渲染它正常。可能有可能潜入到另一个地方的ViewResult的呼叫链中,并改变了Render的运作方式,但是粗略地看一下代码并没有显示任何内容。虽然框架相当不错,但对于进程部分的调用堆栈来说,还不够细致,可以轻松地在此过程中更改单个步骤。如果他们将ExecuteResult打破了一些不同的可覆盖方法,我们可以将其从渲染更改为输出流,以便渲染到我们的流,而不会覆盖整个ExecuteResult方法。好吧….

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读