1

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

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

示例代码:

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

1 回答 1

0

我现在面临的好问题。我也不知道答案,我想有人会修改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从另一个页面交叉发布事件)。还是不推荐。

注意:如果您正在编写母版页,则需要PreviousPagePage母版页类 ( Page.PreviousPage) 上的属性中引用。

于 2014-06-23T09:00:29.363 回答