在事件处理程序中使用 preserveForm true 的服务器传输将重新触发该事件处理程序



在事件处理程序中使用 preserveForm true 的服务器传输会重新触发该事件处理程序并导致无限循环。我的问题:如何在处理程序中指示事件已处理。

PS:我知道我们可以将 preserveForm 设置为 false,但我不想那样做。

示例代码:

protected void rbThemes_SelectedIndexChanged(object sender, EventArgs e)
{
    Server.Transfer(Request.FilePath, true); 
}
我现在

面临的好问题。 我也不知道答案,我想有人会修改Request.Form数据以删除事件,尽管我不确定如何干净利落地执行此操作。

作为一种解决方法,我在 Context.Items 中使用了保护标志,该标志也被保留。

protected void rbThemes_SelectedIndexChanged(object sender, EventArgs e)
{
    if (IsSecondPass()) return;
    Server.Transfer(Request.FilePath, true); 
}
private bool IsSecondPass()
{
    const string key = "SECOND_PASS_GUARD";
    if (Context.Items[key] == null)
    {
        Context.Items[key] = new object();
        return false;
    }
    else
    {
        Context.Items.Remove(key);
        return true;
    }
}

我不推荐这个,但它有效。(方法名称的选择也很差,因为它有副作用。

还有一个更短的方法:

protected void rbThemes_SelectedIndexChanged(object sender, EventArgs e)
{
    if (PreviousPage != null) return;
    Server.Transfer(Request.FilePath, true); 
}

请注意,如果您进行其他类型的跨页面发布,它不会产生任何不良影响(尽管我不知道为什么或如何从另一个页面交叉发布SelectedIndexChanged事件)。仍然不推荐。

注意: 如果要编写母版页代码,则需要从母版页类 (Page.PreviousPage) 上的 Page 属性引用PreviousPage

相关内容

  • 没有找到相关文章

最新更新