所以这可能听起来有些奇怪,但实际上我正在尝试在控制器中提前渲染视图,以便将其传递给模型中的属性。 (这样我以后可以将视图呈现的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)
创建一个新的方法,进入另一种方法 - 到目前为止没有任何工作。
答案 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);
}