如何覆盖ASP.NET中的页面加载生命周期以防止加载ASPX表单?

时间:2009-04-08 21:28:21

标签: asp.net page-lifecycle response.write

我需要在几个ASPX代码隐藏文件中测试一个条件,在某些情况下,我想完全绕过正常的页面加载过程,以便不加载相应的ASPX页面。 Intead,我想向使用代码隐藏方法编写的浏览器发送自定义响应。

有没有人知道从哪里开始 - 覆盖页面生命周期中的哪些方法以及确保在正常ASPX页面内容被抑制时将自定义Response.Write发送到浏览器的最佳技术?

感谢。

3 个答案:

答案 0 :(得分:7)

可能是最简单的方法 - 使用Page_Load()

protected void Page_Load(object sender, EventArgs e)
{
    bool customResponse = true;
    if (customResponse)
    {
        Response.Write("I am sending a custom response");
        Response.End(); //this is what keeps it from continuing on...
    }
}

答案 1 :(得分:6)

使用Response.End()的“简单”方法对于性能来说非常糟糕,抛出一个终止线程的异常。
http://blogs.msdn.com/b/tmarq/archive/2009/06/25/correct-use-of-system-web-httpresponse-redirect.aspx
http://weblogs.asp.net/hajan/archive/2010/09/26/why-not-to-use-httpresponse-close-and-httpresponse-end.aspx

我有同样的问题并以这种方式解决了。这是一个两步过程:首先调用HttpApplication.CompleteRequest()并退出处理。接下来重写Render(),以便不调用基本方法。然后示例代码变为:

bool customResponse = true;

protected void Page_Load(object sender, EventArgs e)
{
    if (customResponse)
    {
        Response.Write("I am sending a custom response");
        this.Context.ApplicationInstance.CompleteRequest();
        return;   // Bypass normal processing.
    }
    // Normal processing...
}

protected override void Render(HtmlTextWriter writer)
{
    if (!customResponse)
        base.Render(writer);        // Then write the page as usual.
}

答案 2 :(得分:0)

这真的取决于你的回复,是发布的表单字段,身份验证信息等......? 使用Page_Load显示的方法将起作用,但页面生命周期中该点之前的任何内容也将执行。