我使用下面的方法渲染PartialViews / Models,以模拟发送的电子邮件。
我使用下面的代码将部分和模型转换为html字符串,我可以将其传递给我的电子邮件发送代码。
public class BaseController : Controller
{
public string RenderPartialViewToString(string viewName, object model)
{
if (string.IsNullOrEmpty(viewName))
throw new ArgumentException("No View Path Provided.");
ViewData.Model = model;
using (StringWriter sw = new StringWriter())
{
ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
return sw.GetStringBuilder().ToString();
}
}
}
目前,它存在于BaseController中,我想将其移出一个帮助方法,以便我可以移动我的电子邮件模型构建/发送出控制器。
问题是我无法访问ViewData / TempData / ControllerContext
我可以新建一个ControllerContext,但我不知道如何处理ViewData / TempData。
这就是我目前在Controller中使用的方法:
//Do Stuff in Controller
var html = RenderPartialViewToString("~/Views/Mail/_ForgotPassword.cshtml", new MailModel { Username = "Skrillex", SomethingElse = "foo" });
//Send the Email
答案 0 :(得分:2)
我认为你走在正确的轨道上,但问题在于你渴望完成分离,这太过于急切了。
您正在使用Razor视图引擎呈现富文本HTML电子邮件。一种非常高尚的方法。但是,这意味着您将非常接近您的表示层,并且从控制器外部运行它 - 在我看来 - 并没有多大意义。
我相信你需要制作(如果还没有制作):
重点是,调用渲染不需要离开控制器,构建电子邮件模型应该。
现在,如果你正在做所有这些,这意味着我没有理解你的问题,需要更多的解释。
答案 1 :(得分:0)
您可以在帮助程序类中创建BaseController的实例或静态属性,如下所示,
public sealed class Helper {
///Gets or sets BaseController
public BaseController { get; set; }
#region "Constructors"
/// <summary>
/// Initialises a new instance of the <see cref="Helper" /> class.
/// </summary>
public Helper() : base() {
}
/// <summary>
/// Initialises a new instance of the <see cref="Helper" /> class.
/// </summary>
public Helper(BaseController baseController) : this() {
this.BaseController = baseController;
}
#endregion
public void SendEmail(){
// Here you can call your RenderPartialViewToString from the BaseController
var m_RenderPartialViewToString = this.BaseController.RenderPartialViewToString( .......);
}}
的问候。希望这会有所帮助。
答案 2 :(得分:0)
我使用了两种Razor渲染电子邮件的方法,需要将它们发送到控制器一侧...首先我将ControllerContext传递给我的服务层,该服务层按预期工作,但不理想....通常我的服务是由命令行应用程序使用或编译到没有ControllerContext可用的Windows服务中...在我第二次尝试时,我使用了这个Razor渲染引擎:http://razorengine.codeplex.com/或https://github.com/Antaris/RazorEngine