2010-09-12 119 views
5

在MVC 2與普通視圖引擎,我可以通過return Json()返回剃刀局部視圖

但隨着新的Razor .cshtml觀點我無法弄清楚返回ASCX局部視圖作爲字符串這個怎麼做。我一直在收到Type 'ASP.CustomerForm_cshtml' does not inherit from 'System.Web.UI.UserControl'.

部分視圖繼承自System.Web.Mvc.WebViewPage<T>,並且如果我從第一個錯誤說的System.Web.UI.UserControl<T>繼承,則彈出另一個錯誤。

有關如何使用ASP MVC 3和Razor視圖引擎解決此問題的任何想法?

這是我ControlToString功能:

private string ControlToString(string controlPath, object model) 
    { 
     ViewPage page = new ViewPage(); 
     ViewUserControl ctl = (ViewUserControl)page.LoadControl(controlPath); 
     page.Controls.Add(ctl); 
     page.ViewData.Model = model; 
     page.ViewContext = new ViewContext(); 
     System.IO.StringWriter writer = new System.IO.StringWriter(); 
     System.Web.HttpContext.Current.Server.Execute(page, writer, false); 
     string outputToReturn = writer.ToString(); 
     writer.Close(); 
     //return this.Json(outputToReturn.Trim()); 
     return outputToReturn.Trim(); 
    } 

回答

6

威力幫助你我都寫過了我的頭頂部沒有測試它除了以驗證它返回渲染CSHTML文件。

我認爲這是一個控制器中的方法。

private string ControlToString(string controlPath, object model) { 
    CshtmlView control = new CshtmlView(controlPath); 

    HtmlTextWriter writer = new HtmlTextWriter(new System.IO.StringWriter()); 
    control.Render(new ViewContext(this.ControllerContext, control, this.ViewData, this.TempData, writer), writer); 

    string value = ((StringWriter)writer.InnerWriter).ToString(); 

    return value; 
} 
+0

謝謝你,它的工作原理。我將視圖看作一個字符串。但是這個模型並沒有在你的代碼中的任何地方被照顧到。我嘗試在'CshtmlView()'中將模型作爲參數添加,但它沒有將模型作爲參數。有什麼想法嗎? – Martin 2010-09-13 06:10:03

+0

我解決了這個問題,你必須在你的代碼中添加'this.ViewData.Model = model;'然後它可以工作:D – Martin 2010-09-13 06:13:25

5

這是代碼的MVC 3 Beta版:

private string ControlToString(string controlPath, object model) 
    { 
     //CshtmlView control = new CshtmlView(controlPath); 
     RazorView control = new RazorView(this.ControllerContext, controlPath, null, false, null); 

     this.ViewData.Model = model; 

     HtmlTextWriter writer = new HtmlTextWriter(new System.IO.StringWriter()); 
     control.Render(new ViewContext(this.ControllerContext, control, this.ViewData, this.TempData, writer), writer); 

     string value = ((StringWriter)writer.InnerWriter).ToString(); 

     return value; 
    } 
+0

感謝你的感謝 - 除了一件我還沒有想到的東西 - 了ControlPath。 MVC中的路徑如何工作?它是物理文件系統路徑嗎? – codedog 2010-11-25 01:46:19

+0

沒關係......看起來「〜/ Views/blah/blah.cshtml」做了訣竅:o) – codedog 2010-11-25 02:33:23