2011-12-20 99 views
-1

所以這可能聽起來有點奇怪,但本質上我試圖在控制器中提前顯示視圖,以便將其傳遞給模型中的屬性。 (這是我以後可以將視圖呈現的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

我想通了。 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); 
} 
1

,而不是返回的觀點,你應該返回原始內容:

return Content(data, "text/html"); 
+0

不工作。我仍然得到一個重複的觀點,最重要的是,這並不能傳遞我的模型。 – 2011-12-20 14:45:15

+0

不會將你的模型傳遞給什麼?嘗試返回'null'或'void'。 – SLaks 2011-12-20 14:56:36

+0

我想要渲染視圖的全部原因是將其傳遞到模型中。使用'return content'不會使用我渲染的數據,並且會破壞這個問題的全部目的。 – 2011-12-20 14:57:53