获取渲染视图的副本

时间:2011-12-20 14:28:15

标签: asp.net-mvc-3

所以这可能听起来有些奇怪,但实际上我正在尝试在控制器中提前渲染视图,以便将其传递给模型中的属性。 (这样我以后可以将视图呈现的HTML传递给服务调用,所以我有理由。)我有几乎完成此代码的代码(改编自this answer),返回已渲染两次的视图的不良副作用:

public ActionResult Action(object paramater)
{
   var model = new MyModel(parameter);
   ViewResult view = View("~/... path to view .../View.cshtml", model);

   string data;

   using (var sw = new StringWriter())
   {
      view.ExecuteResult(ControllerContext);
      var viewContext = new ViewContext(ControllerContext, view.View, ViewData, TempData, sw);
      view.View.Render(viewContext, sw);
      data = sw.ToString();
   }

   model.ViewRender = data;

   return view;
}

这成功地将视图的HTML副本放在模型中,但是视图本身呈现两次(看起来似乎如此),所以我得到的网页是同一个东西的两个副本,一个在另一个的顶部

我尝试了几种不同的方式来返回视图而没有这种副作用 - 使用return View(model)创建一个新的方法,进入另一种方法 - 到目前为止没有任何工作。

2 个答案:

答案 0 :(得分:1)

您应该返回原始内容:

,而不是返回视图
return Content(data, "text/html");

答案 1 :(得分:0)

我明白了。 view.ExecuteResult()直接写入HttpContext.Response,因此在返回新视图之前调用HttpResponse.Clear()非常有效:

public ActionResult Action(object paramater)
{
   var model = new MyModel(parameter);
   ViewResult view = View("~/... path to view .../View.cshtml", model);

   string data;

   using (var sw = new StringWriter())
   {
      view.ExecuteResult(ControllerContext);
      var viewContext = new ViewContext(ControllerContext, view.View, ViewData, TempData, sw);
      view.View.Render(viewContext, sw);
      data = sw.ToString();
   }

   model.ViewRender = data;
   HttpContext.Response.Clear();

   return View("~/... path to view .../View.cshtml", model);
}