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仍然被调用。
谢谢!
关于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
事件处理程序中有一些东西,并且您不希望此代码在重定向调用后执行,您还需要重写这些方法