2010-09-12 111 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