2013-05-05 62 views
0

我知道这看起来像是重复的问题,但在将其标记为重复之前,请先阅读整个问题。将部分视图渲染为字符串

首先,我是simulating the windows service in my ASP web application发送每周的电子邮件,所以在Global.asax我运行我的函数,将发送电子邮件。

现在电子邮件的内容是HTML,我想呈现视图来获取内容。问题是,在我的功能,我没有任何以下内容:

  • Controller
  • ControllerContext
  • HttpContext
  • RoutData
  • ... &得多。这是有道理的,因为函数被调用为回调而不是HTTP请求操作。

我试图使用RazorEngine通过读取文件,然后使用Razor.Parse()方法使用部分作为模板。但是我从这种方法面临很多问题,因为模板中没有包含任何内容。我的意思是:它一直告诉我即使我包含System.Web.Mvc.Html,名称“Html”在当前上下文中不存在'CompiledRazorTemplates.Dynamic.becdccabecff' does not contain a definition for 'Html'

我该如何解决这个问题?

+0

剃刀引擎需要的HttpContext,viewcontext解析视图文件。您可以将带有标记的HTML电子邮件模板放在单独的文件中,然后在预定的任务中使用它来准备最终的电子邮件。 – eka 2013-05-05 07:19:45

回答

1

我认为最好的方法是假设你开发了一个真正的NT服务,并使用HttpClient发送一个http请求到你的局部视图,并以字符串的形式接收响应并用它来组成你的电子邮件。但是,通过在Scheduler类中进行一些更改,您可以在RunScheduledTasks方法中使用HttpContext

public delegate void Callback(); 

public delegate void Callback(HttpContext httpContext); 

添加cache.Current_HttpContext = HttpContext.Current;到运行方法

public static void Run(string name, int minutes, Callback callbackMethod) 
    { 
     _numberOfMinutes = minutes; 

     CacheItem cache = new CacheItem(); 
     cache.Name = name; 
     cache.Callback = callbackMethod; 
     cache.Cache = HttpRuntime.Cache; 
     cache.LastRun = DateTime.Now; 
     cache.Current_HttpContext = HttpContext.Current; 
     AddCacheObject(cache); 
    } 

变化CacheCallback

private static void CacheCallback(string key, object value, CacheItemRemovedReason reason) 
    { 
     CacheItem obj_cache = (CacheItem)value; 
     if (obj_cache.LastRun < DateTime.Now) 
     { 
      if (obj_cache.Callback != null) 
      { 
       obj_cache.Callback.Invoke(obj_cache.Current_HttpContext); 
      } 
      obj_cache.LastRun = DateTime.Now; 
     } 
     AddCacheObject(obj_cache); 
    } 

编辑: 如何使用HttpClient

HttpClient client = new HttpClient(); 
    HttpResponseMessage response = await client.GetAsync("http://localhost/controller/action/"); 
    response.EnsureSuccessStatusCode(); 
    string responseBody = await response.Content.ReadAsStringAsync(); 
+0

先生,我不认为Global.asax应用程序中的'HttpContext不为空'开始...对吗? – Hilmi 2013-05-05 07:55:39

+0

是的,你说得对,它不是null,但是在你的回调方法中它是null,因为从System.Web.Caching调用回调方法。缓存线程 – 2013-05-05 08:14:10

+0

在Global.asax的'Application_Start'方法中,HttpContext不为null。但是在你的回调方法中它是空的,因为从System.Web.Caching.Cache线程调用回调方法。 – 2013-05-05 10:31:49

0

不使用第三方库,可以使用此方法生成的视图中的Global.asax.cs字符串文件

public class EmptyController : Controller { } 

public string GetView(string viewName) 
    { 
    //Create an instance of empty controller 
    Controller controller = new EmptyController(); 

    //Create an instance of Controller Context 
    var ControllerContext = new ControllerContext(Request.RequestContext, controller); 

    //Create a string writer 
    using (var sw = new StringWriter()) 
    { 
     //get the master layout 
     var master = Request.IsAuthenticated ? "_InternalLayout" : "_ExternalLayout"; 

     //Get the view result using context controller, partial view and the master layout 
     var viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName, master); 

     //Crete the view context using the controller context, viewResult's view, string writer and ViewData and TempData 
     var viewContext = new ViewContext(ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw); 

     //Render the view in the string writer 
     viewResult.View.Render(viewContext, sw); 

     //release the view 
     viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View); 

     //return the view stored in string writer as string 
     return sw.GetStringBuilder().ToString(); 
    } 
}