Asp.net mvc 放置电子邮件视图渲染逻辑的可重用位置?
我有一个名为EmailController的控制器,负责发送电子邮件 这方面的一个例子是,我的网站的用户可以“喜欢”的东西,如果其他用户对其中一个“东西”做了一些事情,那么我需要向所有“喜欢”它的用户发送电子邮件。有点像电子邮件提醒 问题是,我不知道如何从另一个操作方法调用我的EmailController的操作方法(当用户做某事时,它是HTTP POST) 通常我会将这种操作(电子邮件)放入服务中,而实际的电子邮件逻辑(SMTP)在服务中是,但是电子邮件控制器负责设置电子邮件的内容(例如HTML),它需要呈现一个字符串视图(因此,它需要控制器上下文,不能进入服务) 我怎样才能做到这一点 我不能只使用静态助手方法,因为如何渲染视图?我需要将控制器上下文传递给该方法或其他东西 流程示例: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
你可以看看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();
}
}