繁体   English   中英

ASP.NET重定向和结束页面

[英]ASP.NET Redirect and End Page

所以我读了很多关于如何正确使用Response.Redirect而不会导致一些错误。

Response.Redirect(url, false);

Context.ApplicationInstance.CompleteRequest();

情况:用户登录站点并访问列出表单的页面。 用户在该页面上坐了一个小时,什么都不做(将其记录下来)。 用户单击按钮以编辑标题(需要回发)。 这导致用户对象为空,因为它将其记录在会话之外。

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

问题:按钮事件仍然是STILL触发。 是因为我有以下代码行吗?

Context.ApplicationInstance.CompleteRequest();

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

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

Response.Redirect(url, true);

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

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

例:

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中使用return语句,仍然会调用Button1_Click。

谢谢!

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

这个主题KB312629上甚至存在KB。

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

因此,我建议创建基页类并添加一个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();

另请注意,如果您在LoadCompletePreRenderSaveViewStateRenderUnload事件处理程序中有一些内容,并且您不希望在重定向调用后执行此代码,您还需要覆盖这些方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM