c# - ASP.NET 重定向和结束页面

标签 c# asp.net redirect webforms

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

Response.Redirect(url, false);

Context.ApplicationInstance.CompleteRequest();

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

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

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

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();
}

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

谢谢!

最佳答案

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

There is even a KB exists on this topic KB312629.

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

所以我建议创建基页面类并添加一个 bool 字段,指示请求完成请求加上将调用 ApplicationInstance.CompleteRequest 的方法并将标志设置为。您还需要覆盖 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 事件处理程序并且您不希望此代码在重定向调用后执行,您还需要重写该方法。

关于c# - ASP.NET 重定向和结束页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25473110/

相关文章:

c# - 如何摆脱 .Net C# 中的 ffmpeg.exe 黑色终端?

c# - 无效操作异常 : Incorrect Content-Type: ASP. NET Core

wordpress - Wordpress 的所有公共(public)/直接入口点是什么?

redirect - Magento 2 无法从管理 Controller 重定向到前端

c# - 在 SQLCLR 方法中使用 SqlXml 参数

c# - 如果我使用 ASP.NET 标识,我会被 EF 困住吗?

javascript - 通过 SelectBox 的下一个上一个按钮

c# - 通过将控件的 ID 属性设置为 "itemPlaceholder"来指定项目占位符

c# - 调用隐藏字段的值时Javascript对象需要错误

.htaccess - 我应该为 htaccess 使用重定向 301