ASP.NET Page_Load在Chrome中触发两次且IsPostback值异常
问题描述
我有一个ASP.NET Web应用,近期出现异常:仅在Google Chrome浏览器中,点击任意按钮时,各页面的Page_Load方法总会执行两次——第一次IsPostBack参数值正确,第二次则不正确。
我了解到Page_Load多次执行可能是页面存在空href或空src引用,但排查后未发现此类情况。涉及页面的登录按钮ASPX代码如下:
<asp:LinkButton runat="server" ID="lnkBtnLogin" class="btn btn-default btn-lg btn-block" OnClick="lnkBtnLogin_Click" Text="LOGIN"></asp:LinkButton>
即使将后台lnkBtnLogin_Click方法代码清空,问题仍存在:
protected void lnkBtnLogin_Click(object sender, EventArgs e) { }
为进一步排查,我新建了ASP.NET Web Forms项目、母版页和仅含一个按钮的空白页面,依旧出现相同异常:首次进入页面时Page_Load触发两次(IsPostBack=false);点击按钮时,按钮事件仅触发一次,但Page_Load触发两次,一次IsPostBack=true,一次IsPostBack=false。
由于是新项目,我怀疑是Visual Studio配置、应用属性或web.config的问题,已将空白解决方案上传至代码仓库。
可能的解决方向
禁用Chrome自动填充功能:Chrome的自动填充(尤其是密码自动填充)可能在页面加载后触发额外请求。可以在页面的
<form>标签或目标控件上添加autocomplete="off"属性测试:<form runat="server" autocomplete="off"> <!-- 或给按钮添加 --> <asp:LinkButton runat="server" ID="lnkBtnLogin" class="btn btn-default btn-lg btn-block" OnClick="lnkBtnLogin_Click" Text="LOGIN" autocomplete="off"></asp:LinkButton>检查Session配置:如果web.config中
<sessionState>设置为cookieless="UseUri",Chrome处理带Session ID的URL时可能触发重复请求。建议修改为Cookie模式:<sessionState mode="InProc" cookieless="UseCookies" timeout="20" />排查资源请求异常:打开Chrome开发者工具(F12)的Network标签,操作页面时查看是否有两次完整的页面请求,或存在失败的资源引用(如CSS、JS、图片)——这类失败请求的重试机制可能导致页面二次加载。
关闭Chrome预加载功能:Chrome的“预加载网页以提高浏览速度”功能可能提前加载页面引发重复请求,可在Chrome设置中搜索“预加载”并关闭该选项后测试。
检查Visual Studio调试配置:确认项目属性的“Web”设置中,服务器使用IIS Express;同时关闭“启用编辑并继续”等可能导致页面重新加载的调试选项。
内容的提问来源于stack exchange,提问作者Martina

