asp:button 重新加载页面而不是在 Sitecore 中触发 OnClick 事件

asp:button reloads the page instead of firing OnClick event in Sitecore

我正在使用 Sitecore,并且我有一个在所有页面中使用的 header 子布局。此布局包含一个注销按钮,单击该按钮会触发 OnClick 事件并执行 onclick 事件函数。但在少数页面中,它根本不会触发 OnClick 事件,而是重新加载页面。

下面是注销按钮的代码

<asp:button id="btnLogout" runat="server" borderstyle="None" onclick="btnLogout_Click" text="Log out" ToolTip="Log out" backcolor="Transparent" style="cursor:pointer" class="logout_new"></asp:button>

下面是事件函数的代码

protected void btnLogout_Click(object sender, EventArgs e)
{              
   Sitecore.Security.Authentication.AuthenticationManager.Logout();
   Response.Redirect("/Login.aspx");
}

我发现注销会触发 onclick 事件的页面与不会触发 onclick 事件的页面之间的区别在于,它们使用包含注销按钮的相同 header 子布局,但它们使用不同的内容子布局不过

注意:我没有将缓存应用于任何子布局。

谁能帮我解决这个问题?

尝试像 return 和 html 一样禁用缓存而不触发后端代码。 为此,一种选择是转到这些页面的演示详细信息,找到控件并单击它进行编辑。在 "Caching section" 下取消选中 "Cacheable" 并发布项目。如果这解决了您的问题,我会查看模板的标准值,以将更改应用于具有相同模板的所有项目

这种行为在我身上也时常发生,但它几乎总是同一件事:代码所在的 Sitecore 子布局正在被缓存。

onclick javascript 触发,但页面不会重新呈现新内容,因为 "unclicked" 版本存储在缓存中。

您需要禁用子布局上的缓存才能使按钮正常工作。

但是,如果您尝试缓存尽可能多的演示内容,这可能会有些烦人。在这些情况下,这通常意味着您需要创建多个 "sub-sublayouts" 并静态放置它们,这与直觉相反。将包含的子布局设置为未缓存,然后您可以适当地设置每个较小的缓存(缓存静态部分,而不是缓存动态内容)。

根据给定的上下文,我不知道问题出在哪里,但如果我遇到这样的问题,我会怎么做。

正如您所说,它只在几个页面上不起作用,可能是该特定页面上的其他控件导致了问题。

我会选择两个在表示层上控制较少的页面。假设 PageA 是工作页面,PageB 是非工作页面。然后我比较 PageA 和 PageB 并删除所有公共控件,这应该会缩小表示层上控件的数量。现在再次检查页面 B 是否正常工作。如果没有,我将尝试在 PageB 上一次删除一个控件,直到它开始工作。如果通过删除某些控件发现页​​面开始工作,那么您可以查看特定控件并确定问题。

希望对您有所帮助。

问题出在它不工作的内容子布局中,Page_Load 函数正在调用一个 Response.Redirect 函数给它自己,它没有检查它是否是一个 post 在此之前返回请求或不。因此,每当用户单击注销按钮时,它都会 post 返回到服务器,并且页面会重新加载而不是执行 onclick 事件。

我注意到在它工作的其他内容子布局中,它正在检查它是否是 post 后退。

我在此之前添加了一个 if(!IsPostBack),它开始工作了。