我有一个简单的下拉菜单,可以根据用户的选择重新加载包含相关数据的页面。我注意到当我尝试返回时,下拉菜单的所选项目不正确。
例如,如果用户第一次加载页面并且下拉菜单选择了 1a,然后用户选择 2b,则页面将重新加载,并且下拉菜单现在选择了 2b。同样,用户选择 3c,页面重新加载,现在 3c 被选中。
但是当用户点击后退按钮时,页面返回到之前的状态后,下拉菜单停留在3c。如果用户再次单击后退按钮,页面返回后,下拉列表现在会显示已选择的 2b(而不是 1a)。
这是正常行为还是我错过了什么?
找到了这些,但没有运气
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:DropDownList ID="abcd" runat="server" AutoPostBack="true">
<asp:ListItem>1a</asp:ListItem>
<asp:ListItem>2b</asp:ListItem>
<asp:ListItem>3c</asp:ListItem>
<asp:ListItem>4d</asp:ListItem>
<asp:ListItem>5e</asp:ListItem>
</asp:DropDownList>
</div>
</form>
</body>
</html>
这里一点也不奇怪。
如果您登陆该页面并返回,那么您会看到其他上一页。
只有当您回发当前页面时,历史记录才会开始!
所以,第一页加载并不是历史的一部分。您需要回发邮件才能发生这种情况。
有一个很好的方式来观察它的实际情况吗?删除自动回发,并在组合框旁边放置一个简单的按钮。
所以,说出这个标记:
<asp:DropDownList ID="abcd" runat="server" >
<asp:ListItem>1a</asp:ListItem>
<asp:ListItem>2b</asp:ListItem>
<asp:ListItem>3c</asp:ListItem>
<asp:ListItem>4d</asp:ListItem>
<asp:ListItem>5e</asp:ListItem>
</asp:DropDownList>
<asp:Button ID="Button1" runat="server"
Text="test button"
style="margin-left:40px"
/>
所以,现在当页面加载时,请注意如何没有启用后退按钮(没有历史记录)。
你看到这个,我可以做出 2 或 10 个组合选择,但在我按下按钮之前不会发生更新。
因此,不会出现后退箭头,并且历史记录仅在我回发时才开始。因此,如果我首先点击按钮,那么第一个组合框值就会输入历史记录。但是,如果我不做出选择(不改变)组合,那么历史就不会开始。
因此,对于每次回发,您都会有一个全新的浏览器页面。但是,您在第一个页面加载时没有回发。 (所以,第一页还没有在您的历史缓冲区中,是吗?)。
因此,浏览器仅在发生完整的新回发时才启动给定页面的历史记录。
如果没有发生回发,则返回将转到某个不同的上一页。
因此,在首页加载时,您没有任何历史记录!没有什么可以回去的! (其中包括具有当前组合框选择的当前页面)。
因此,您实际上将丢失第一页组合设置,除非您使用第一个默认选择回发该页面。
取消自动回发,让页面加载,然后点击第一个默认组合框的按钮。现在它将载入您的历史。
最好声明首页加载尚未输入到您的浏览器历史记录中,并且尚未经历回发。事实上,真正发生的是视图状态没有更新。
所以,这就像在你的桌子上放置一张白纸,然后你开始在该页上绘图 - 进行更改。好吧,现在画完后,你发回来,现在假装你的照片复制了第一页。现在您可以再画一些,然后再次发回(照片复制页面)。
现在,将所有纸张拉回第一张 - 上面将有您的绘图 - 它不会是空白的,因此原始组合框选项也不会出现在该页面上。
前一页的堆栈仅在您回发时才开始 - 因此您会丢失第一个组合框,因为它从来都不是历史记录的一部分,而只是加载第一个空白页。仅当对页面进行更改(带有回发)时,可见更改的历史记录才会开始。
我可以对视图状态进行复杂的讨论,但足以说明控件的视图状态仅在给定页面的第一次回发时真正启动和更新,而不是在第一页加载时。