【发布时间】:2012-02-03 22:42:52
【问题描述】:
我有一个使用DropDownList 控件进行部分导航的 ASP.NET 2.0 Web 应用程序。当其中一个发生更改时,它会导致回发,然后根据下拉列表中选择的内容将其重定向到另一个 URL。
我注意到在使用下拉菜单后使用浏览器的后退按钮时出现了奇怪的行为。程序是这样的:
- 在其中一个下拉列表中进行选择,导致回发和重定向。到目前为止很好。
- 点击浏览器的返回按钮。
- 在另一个导航下拉列表中在之前使用的下拉列表下方(它们都包含在一个
div中),进行选择。页面重定向到与第一次相同的 URL,而不是根据其他下拉列表重定向到的位置。
我在 Firefox 10 和 IE9 中都尝试过,并且看到了同样的结果。我查看了 Firebug 中的 Net 选项卡,发现在第 3 步的 POST 中,引用了正确的控件。但是当我调试它时,错误下拉列表(第 1 步中使用的下拉列表)的事件处理程序会触发。
代码非常简单明了。标记示例:
<asp:DropDownList runat="server" ID="ddlTest" AutoPostBack="true" />
下拉菜单实际上不是普通的<asp:DropDownList ... /> 元素;我使用类似于this 的方法插入optgroup 元素。
C# 示例:
ddlTest.Click += new EventHandler(ddlTest_SelectedIndexChanged);
在ddlTest_SelectedIndexChanged:
if (ddlTest.SelectedValue != "")
{
Response.Redirect(MyUtilClass.GetUrl(ddlTest.SelectedValue));
}
这是怎么回事?
2012 年 2 月 6 日更新:我已通过在我的 SelectedIndexChanged 事件处理程序中检查 Request["__EVENTTARGET"] 的内容来解决此问题。不过,我仍然很好奇为什么会这样。为什么第一个事件会重复?为什么只有当第二个回发发生在第一个下方的控件时才会发生这种情况?
【问题讨论】:
-
您可以为下拉菜单添加页面中的标签吗?会有所帮助。
-
下拉菜单的标签?你是指他们在页面上的ID吗?还是他们的标记?它看起来很像我在问题中发布的标记。
-
只是一个建议:即使不使用后退按钮,您的导航也不会表现出我所谓的预期行为。通常,导航应该与您的内容同步。这样,当您单击学校名称时,就会在您的下拉列表中选择该学校。其实,越看越觉得off。好像您可以摆脱整个左侧导航(将房地产收回)并在顶部提供两个下拉菜单:学校和运动。无论如何,其他人完全依赖于该信息......它的价值为 0.02 美元。
-
@ChrisLively - 日历除外。在这种情况下,您不能保持下拉菜单与内容同步,因为日历可以显示今天、昨天、明天、本周、下周或上周以外的内容。不过,这是个好建议;我会进一步调查。