2009-08-28 95 views
0

阅读母版页路径我有一个方法净MVC:从任何视图

RenderToString(string pathToView, string pathToMasterPage) 

其中,好像是这个名字已经说,渲染视图,并返回结果为一个字符串。目前,我必须将路径传递到主页面,作为该方法的参数。但由于视图本身包含媒体链接母版页

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> 

我想知道是否有可能programaticly阅读价值的定义,所以我没有把它作为一个单独的参数了吗?

+0

对不起,但你介意将代码分享给你的RenderToString函数吗?我使用的解决方法是在我自己的服务器上执行http请求。它工作正常,但你的方法似乎更好。 – 2009-08-28 19:32:21

回答

1

的RenderToString方法是这样的:

public virtual string RenderToString(string viewPath, string masterPath) 
{ 
    ControllerContext controllerContext = this.ControllerContext; 
    Stream filter = null; 
    ViewPage viewPage = new ViewPage(); 

    viewPage.ViewContext = new ViewContext(this.ControllerContext, new WebFormView(viewPath, masterPath), this.ViewData, this.TempData); 

    //get the response context, flush it and get the response filter. 
    var response = viewPage.ViewContext.HttpContext.Response; 
    response.Flush(); 
    var oldFilter = response.Filter; 

    try 
    { 
     //put a new filter into the response 
     filter = new MemoryStream(); 
     response.Filter = filter; 

     //render the view into the memorystream and flush the response 
     viewPage.ViewContext.View.Render(viewPage.ViewContext, viewPage.ViewContext.HttpContext.Response.Output); 
     response.Flush(); 

     //read the rendered view 
     filter.Position = 0; 
     var reader = new StreamReader(filter, response.ContentEncoding); 
     return reader.ReadToEnd(); 
    } 
    finally 
    { 
     //Clean up. 
     if (filter != null) 
     { 
      filter.Dispose(); 
     } 

     //Now replace the response filter 
     response.Filter = oldFilter; 
    } 
} 

它并不完美。执行该方法后,您不能再执行任何重定向,因为必须刷新响应,因此头文件已经发送。如果您找到解决方法,请在此处发布。

+0

当我想要做同样的事情时,我发现了同样的帖子。当我试图在Json调用中返回一个呈现的用户控件时,发送的头文件足以阻止这对我的工作。不错,你可以发布这个阿德里安虽然+1 – 2009-08-28 20:24:07

+0

我有同样的问题。我通过渲染仅部分(字符串)而不是呈现整页来解决此问题。渲染局部时,您不必刷新响应。 – Mato 2009-08-28 20:52:12