我正在使用 ASP.NET MVC3
我有一个.cshtml
视图,我想将其字符串化以合并到电子邮件正文中。
这是我使用的方法:
//Renders a view to a string
private string RenderRazorViewToString(string viewName, object model)
{
ViewData.Model = model;
using (var sw = new System.IO.StringWriter())
{
var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
viewResult.View.Render(viewContext, sw);
viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
return sw.GetStringBuilder().ToString();
}
}
当我从ActionResult
从 Ajax 调用中调用的方法中调用此方法时,这非常有效。
但是,我面临一个不寻常的情况:
在我的Global.asax
文件中,我有一个每 10 分钟调用一次的方法,其目标是验证最近 10 分钟内是否在数据库中创建了一些特殊记录,如果是,则发送电子邮件。当然,邮件正文就是这个字符串化的视图。
这是我的一段代码:这个方法非常受这篇文章的启发
/* File : Gloabal.asax.cs */
private static CacheItemRemovedCallback OnMatchingCacheRemove = null;
protected void Application_Start()
{
// ...
AddMatchingTask("SendEmail", 600);
}
private void AddMatchingTask(string name, int seconds)
{
OnMatchingCacheRemove = new CacheItemRemovedCallback(CacheItemMatchingRemoved);
HttpRuntime.Cache.Insert(name, seconds, null, DateTime.UtcNow.AddSeconds(seconds), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, OnMatchingCacheRemove);
}
//This method is called every 600 seconds
public void CacheItemMatchingRemoved(string k, object v, CacheItemRemovedReason r)
{
using (MyEntities context = new MyEntities())
{
var qMatching = from m in context.MY_TABLE
where m.IsNew == true
select m;
if (qMatching.Any())
{
MatchingController matchingController = new MatchingController();
matchingController.SendEmail();
}
}
// re-add our task so it recurs
AddMatchingTask(k, Convert.ToInt32(v));
}
该SendEmail()
方法应该创建电子邮件的正文,获取视图并将其放入 HTML 字符串中以发送
public void SendEmail()
{
/* [...] Construct a model myModel */
/* Then create the body of the mail */
string htmlContent = RenderRazorViewToString("~/Views/Mailing/MatchingMail.cshtml", myModel);
}
在这里,RenderRazorViewToString()
(方法的主体在这篇文章的顶部给出)在这一行失败:
var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
ControllerContext 不能为空
为什么,仅在这种情况下,ControllerContext
是null
?我已经阅读了这篇文章,但如果我理解正确,这是因为我手动实例化了我的控制器写作:
MatchingController matchingController = new MatchingController();
但是,我不知道如何继续...
任何帮助将不胜感激。
谢谢