ASP.. NET重定向和结束页

本文关键字:结束 重定向 NET ASP | 更新日期: 2023-09-27 18:19:13

所以我读了很多关于如何正确使用响应。重定向而不引起错误。

Response.Redirect(url, false);
Context.ApplicationInstance.CompleteRequest();

情境:用户登录站点并访问一个列出表单的页面。用户在该页面上呆了一个小时什么也不做(这会使他们退出)。用户单击按钮来编辑标题(这需要回发)。这将导致用户对象为空,因为它将用户从会话中注销。

我所做的:在页面加载中,检查用户对象是否为空,如果是,重定向到登录页面。这是应该发生的,对吗?

问题:按钮事件仍在触发。是因为我有下面这行代码吗?

Context.ApplicationInstance.CompleteRequest();

当我只想重定向到登录页面时,我如何阻止事件被触发?

我知道我可以在重定向代码中提供true,但这会导致错误,对吧?

Response.Redirect(url, true);

我目前所做的(这不是我所知道的最好的方法):在按钮事件中,我再次检查用户对象是否为空。如果它不是空的,继续代码编辑标题(记录谁编辑它)。这是一种糟糕的处理方式。

我所看到的:用response . isrequestbeingredirects包装所有事件。但如果我有几个页面和很多按钮事件,这可能会有点烦人。这是处理这种情况的唯一办法吗?

的例子:

protected void Page_Load(object sender, EventArgs e)
{
    Account account = Session["Account"] as Account;
    if (account == null)
    {
        Response.Redirect("WebForm1.aspx?NewSession=true", false);
        Context.ApplicationInstance.CompleteRequest();
        return;
    }
}
protected void Button1_Click(object sender, EventArgs e)
{
    Account account = Session["Account"] as Account;
    Label1.Text = account.userID.ToString();
}

同样,如果我已经在页面上,并且会话已过期,并且我单击Button1,则仍然调用Button1_Click方法。我所提供的将给我一个"NullReferenceException"。Page_Load正在被调用,它正在进行重定向。但是,即使在Page_Load中使用返回语句,Button1_Click仍然被调用。

谢谢!

ASP.. NET重定向和结束页

关于Response.Redirect(url, true)你是正确的。这有点昂贵,因为它抛出ThreadAbortException导致当前线程终止,这不是你想要的大多数时间。

甚至有一个关于这个主题的知识库KB312629。

是的,用你的代码是不可能阻止事件触发当前IHttpHandler (Page类实现)使用内置类/方法。

所以我建议创建基页类并添加一个bool字段,指示请求完成请求加方法,该方法将调用ApplicationInstance.CompleteRequest并将标志设置为true。此外,您需要重写RaisePostBackevent方法来控制控件(而不是页面)事件在页面上的调用。

public abstract class BasePage : Page 
{
    private bool shouldNotRaiseEvents;
    protected void CompleteRequest() 
    {
        shouldNotRaiseEvents = true;
        Context.ApplicationInstance.CompleteRequest();
    }
    protected override void RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument)
    {
        if (shouldNotRaiseEvents) 
        {
            return;
        }
        base.RaisePostBackEvent(sourceControl, eventArgument);
    } 
}

你更新后的代码应该是:

Response.Redirect(url, false);
CompleteRequest();

还请注意,如果您在LoadComplete, PreRender, SaveViewState, Render, Unload事件处理程序中有一些东西,并且您不希望此代码在重定向调用后执行,您还需要重写这些方法