拦截ASP.Net MVC 2中的HTTP

时间:2010-10-19 12:17:25

标签: asp.net asp.net-mvc-2

有没有人知道我如何拦截页面的HTML并阻止它被渲染回客户端?

我在控制器方法中尝试了以下内容:

var writer = new StringWriter();
var response = new HttpResponse(writer);
var context = new HttpContext(existingContext.Request, response) { User = existingContext.User };            
System.Web.HttpContext.Current = context;

//The method controller method returning an ActionResult for the page I want to render
var ViewResult = ControllerMethod();
ViewResult.ExecuteResult(this.ControllerContext);
string html = writer.ToString();

我认为在这一点上,html字符串应该包含已经呈现的页面的HTML。就目前而言,html变量是一个空字符串。我怀疑这是因为设置System.Web.HttpContext.Current不会影响控制器的HTTP上下文。这是一个可能的原因,如果有的话,是否有一个批准的方法来设置上下文,因为该属性是只读的?

我正在尝试通过捕获正在创建的原始HTML并将其传递给第三方组件来将页面呈现为PDF。然后,包含上述代码的控制器操作将获取原始HTML并将其转换为PDF,然后返回。

1 个答案:

答案 0 :(得分:2)

使用以下内容将视图呈现为字符串 - 然后可以将其传递给PDF生成器

string RenderViewToString(string viewName, object model, string masterName)
{
    if (string.IsNullOrEmpty(viewName))
        viewName = ControllerContext.RouteData.GetRequiredString("action");

        ViewData.Model = model;

        using (StringWriter sw = new StringWriter())
        {
            ViewEngineResult viewResult = ViewEngines.Engines.FindView(ControllerContext, viewName, masterName);

            ViewContext viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);

            viewResult.View.Render(viewContext, sw);

            return sw.GetStringBuilder().ToString();
        }
    }