【问题标题】:Render partial view as string将部分视图渲染为字符串
【发布时间】:2013-05-05 06:18:15
【问题描述】:

我知道这看起来像是一个重复的问题,但请在将其标记为重复之前阅读整个问题。

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

现在电子邮件内容是 HTML 格式,我想渲染视图以获取内容。问题是在我的函数中,我没有以下任何内容:

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

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

我该如何解决这个问题?

【问题讨论】:

  • Razor 引擎需要 httpcontext、viewcontext 来解析视图文件。您可以在单独的文件中使用带有令牌的 html 电子邮件模板,并在计划任务中使用它来准备最终的电子邮件。

标签: asp.net-mvc asp.net-mvc-3 razor partial-views


【解决方案1】:

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

 public delegate void Callback();

 public delegate void Callback(HttpContext httpContext);

在 Run 方法中添加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();

【讨论】:

  • 先生,我不认为 Global.asax 应用程序中的HttpContext is not null 开始......对吗?
  • 是的,你是对的它不是null,但是在你的回调方法中它是null,因为回调方法是从System.Web.Caching.Cache线程调用的
  • Global.asaxApplication_Start方法中,HttpContext不为空。但是在你的回调方法中它是空的,因为回调方法是从 System.Web.Caching.Cache 线程调用的。
  • 您说得对,先生,我只有一个问题,我们可以从 HttpContext 中提取 ControllerContext
  • 不,我们无法获得ControllerContext。正如我在答案中提到的,最好的方法是通过HttpClientGetAsync 获取部分视图,就像在 NT 服务或控制台应用程序中必须做的那样。
【解决方案2】:

在不使用第三方库的情况下,可以使用此方法在 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();
   }
}

【讨论】:

    猜你喜欢
    • 2015-11-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2015-07-16
    相关资源
    最近更新 更多