将视图渲染为字符串(异步)

时间:2014-02-21 04:14:37

标签: c# asp.net-mvc asynchronous

我在这里使用答案(https://stackoverflow.com/a/2759898)将视图呈现为字符串。

我是async await的新手。只需要知道以下代码是否会实际释放资源,直到呈现视图为止?假设我的视图需要5秒才能渲染。

public async Task<string> RenderViewToString(string viewName, object model)
{
  ViewData.Model = model;
  using (var sw = new StringWriter())
  {
    return await Task.Run(() =>
    {
      var razor = new RazorViewEngine();
      var viewResult = razor.FindView(ControllerContext, viewName, null, false);
      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();
    });
  }
}

P.S。不要问我为什么我的观点需要花时间来呈现。虽然对于这个特定的实例不是推荐的做法,但我必须在视图中调用几个Web服务并创建json输出。

3 个答案:

答案 0 :(得分:2)

没有。这样做实际上是从ASP.NET线程池中获取另一个线程来运行Task.Run()的主体。在Task.Run()执行期间,请求线程返回到线程池。一旦Task.Run()完成,它将返回该线程并获得一个完成请求。所有这些代码正在做的就是添加工作......这实际上使事情变得更糟。

如果视图正在调用Web服务,请查看是否可以异步调用Web服务。这就是async / await会提高效率的地方。

答案 1 :(得分:1)

如果您的视图正在调用Web服务,则不会遵循MVC模式 - “呈现”视图所需的时间不应包括进行Web服务调用所需的时间 - 您应该在控制器中进行所有这些操作并将带有所有Web服务结果/数据的最终模型传递给视图 - 然后不必担心保留视图或其他资源......

此外,当结果是Json时,即使有视图也没有逻辑上的原因 - 你应该只有一个返回JsonResult的控制器。

答案 2 :(得分:0)

虽然您将要使用的上下文不清楚,但我只是推测您正在尝试获取渲染视图,以便可以使用Ajax返回它,并且只是允许您更新页面的某些区域。

嗯,这不是MVC的正确方法。正如Rob所说,你应该尝试使用JsonResult。如果您认为您希望将Web Service中返回的数据传递给视图,那么最好尝试获取JsonResult并使用Ajax调用此方法。

此外,如果您尝试使用此呈现视图作为字符串以某种方式替换页面或元素的内容,更好的方法是简单地创建一些部分视图并在视图中调用它们@ Html.Action(“查看”, “控制器”)。这样你甚至可以得到html。您也可以使用Ajax调用它并将其推送到要显示视图的容器元素。