在事件处理程序中使用 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
。