Я использую ASP.NET MVC3
У меня есть .cshtml
мнение, и я хочу stringify его для включения в теле сообщения электронной почты.
Вот метод я использую:Рендер вид бритвой строки => ControllerContext равно нулю, когда вызывается из возвратного задачи
//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 минут, и если да, отправляет электронное письмо. Конечно, этот электронный адрес ... вид.
Вот часть моего кода: Этот метод очень вдохновлен this post
/* 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));
}
The 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
? Я прочитал this post, но если я правильно понял, это потому, что я вручную экземпляр моего контроллера письма:
MatchingController matchingController = new MatchingController();
Однако, я не знаю, как поступить иначе ...
Любая помощь будет очень оценен.
Спасибо
Благодарим вас за ответ. Однако Url.AbsoluteAction, похоже, не существует. Я следую вашей идее и делаю некоторые исследования о WebClient() и нашел эту ссылку: http://stackoverflow.com/questions/7779824/using-c-sharp-webrequest-to-interact-with-an-asp-net-mvc -3-сайт, который мне очень помог. Так что ваша идея была хорошей, спасибо большое! – AlexB