Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 放置电子邮件视图渲染逻辑的可重用位置?_Asp.net Mvc_Asp.net Mvc 3_Email_Dry_Separation Of Concerns - Fatal编程技术网

Asp.net mvc 放置电子邮件视图渲染逻辑的可重用位置?

Asp.net mvc 放置电子邮件视图渲染逻辑的可重用位置?,asp.net-mvc,asp.net-mvc-3,email,dry,separation-of-concerns,Asp.net Mvc,Asp.net Mvc 3,Email,Dry,Separation Of Concerns,我有一个名为EmailController的控制器,负责发送电子邮件 这方面的一个例子是,我的网站的用户可以“喜欢”的东西,如果其他用户对其中一个“东西”做了一些事情,那么我需要向所有“喜欢”它的用户发送电子邮件。有点像电子邮件提醒 问题是,我不知道如何从另一个操作方法调用我的EmailController的操作方法(当用户做某事时,它是HTTP POST) 通常我会将这种操作(电子邮件)放入服务中,而实际的电子邮件逻辑(SMTP)在服务中是,但是电子邮件控制器负责设置电子邮件的内容(例如HTM

我有一个名为EmailController的控制器,负责发送电子邮件

这方面的一个例子是,我的网站的用户可以“喜欢”的东西,如果其他用户对其中一个“东西”做了一些事情,那么我需要向所有“喜欢”它的用户发送电子邮件。有点像电子邮件提醒

问题是,我不知道如何从另一个操作方法调用我的EmailController的操作方法(当用户做某事时,它是HTTP POST)

通常我会将这种操作(电子邮件)放入服务中,而实际的电子邮件逻辑(SMTP)在服务中是,但是电子邮件控制器负责设置电子邮件的内容(例如HTML),它需要呈现一个字符串视图(因此,它需要控制器上下文,不能进入服务)

我怎样才能做到这一点

我不能只使用静态助手方法,因为如何渲染视图?我需要将控制器上下文传递给该方法或其他东西

流程示例:

  • 用户A进入页面并提交表单
  • 调用HTTP POST ControllerActionMethodA,将数据提交到DB
  • 卡住了
  • 因此,在第3步,我需要:

  • 从刚刚发布的数据中提取一些信息
  • 创建视图模型
  • 将强类型视图呈现为字符串
  • 调用我创建的服务方法以发送SMTP电子邮件
  • 目前,我有2/3/4以上的EmailController,所以我希望使用它

    作为补充说明,我希望使电子邮件异步(因为刚刚创建一些数据的用户并不关心其他用户是否需要收到电子邮件)

    有谁能给我一些建议,告诉我如何组织这些独立的关注点(提交数据、将HTML视图创建为字符串、发送电子邮件)

    也许在基本控制器中使用HTML助手或受保护的方法比使用控制器更好

    仅供参考,这里是我的“查看字符串”方法(我从另一个堆栈问题中提取,效果非常好):


    你可以看看nuGet的ActionMailer包。然后你就不需要一个单独的控制器了。

    看起来很有希望。主要是你不需要发送单独的HTTP请求。我会试试看,让你知道我是怎么做的。效果非常好。我不得不做一些修改:因为没有HTTP上下文,需要通过任何URL的,在ctor中的依赖项,等等。但是很好地工作,并且与我的自定义视图引擎也很好地工作。谢谢!很高兴听到,很高兴我能提供帮助。
    protected string RenderViewToString(string viewName, object model)
    {
        if (string.IsNullOrEmpty(viewName))
            viewName = ControllerContext.RouteData.GetRequiredString("action");
    
        ViewData.Model = model;
    
        using (var sw = new StringWriter())
        {
            var viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName, null);
            var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
            viewResult.View.Render(viewContext, sw);
    
            return sw.GetStringBuilder().ToString();
        }
    }