UpdatePanel 不会阻止按钮重新加载页面
UpdatePanel does not prevent button from reload page
我只是想做空 by making a short prototype to test the UpdatePanel functionality to disable ASP.NET page reload on linkbutton click. I have seen this approach in questions like this。为了对此进行测试,我创建了一个新的 ASP.NET WebForms 应用程序,添加了一个 ASP LinkButton,由 UpdatePanel 包围。我在 Visual Studio .cs 文件中为 OnClick 和 PageLoad 事件添加了断点。这是 ASP 文件中的代码:
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:LinkButton ID="LinkButton1" OnClick="OnLinkClick" runat="server">Click me, no reload, I promise!</asp:LinkButton>
</ContentTemplate>
</asp:UpdatePanel>
以及.cs文件代码:
protected void Page_Load(object sender, EventArgs e)
{
//page reload things...
}
protected void OnLinkClick(object sender, EventArgs e)
{
//on click thigs...
}
每次我点击 LinkButton 时,触发的第一个断点是 PageLoad 断点,然后是 OnClick 断点。我认为使用 UpdatePanel 会避免这种行为。
我做错了什么,或者为什么我不应该期望 PageLoad 不会被调用?这是测试 LinkButton 单击是否重新加载页面的好方法吗?
即使您正在执行部分 post 返回,框架仍会执行包括 Page_Load 的页面生命周期。但是您只能在浏览器中对更新面板内的控件进行更改。
正如 techspider 提到的,您需要分配一个 post 后退触发器。所以你的例子应该是这样的。
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:LinkButton ID="LinkButton1" OnClick="OnLinkClick" runat="server">Click me, no reload, I promise!</asp:LinkButton>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="LinkButton1" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
正如Clint B所说,代码隐藏中回发事件的处理是正常的。您可以使用两个标签测试您的 UpdatePanel,一个在 UpdatePanel 内部,一个在 UpdatePanel 外部:
<asp:Label ID="lbl1" runat="server" Text="Label 1" BackColor="Aqua" />
<asp:UpdatePanel ID="up1" runat="server">
<ContentTemplate>
<asp:Label ID="lbl2" runat="server" Text="Label 2" BackColor="Yellow" />
<asp:LinkButton ID="LinkButton1" runat="server" Text="Update, no reload!" OnClick="OnLinkClick" />
</ContentTemplate>
</asp:UpdatePanel>
LinkButton 的事件处理程序更新两个标签:
protected void OnLinkClick(object sender, EventArgs e)
{
lbl1.Text = DateTime.Now.ToString();
lbl2.Text = DateTime.Now.ToString();
}
如果部分刷新有效,对 lbl2
所做的更改在页面中可见,而 lbl1
仍显示其原始文本。
我发现当我在更新面板中使用 LinkButton 时,页面正在执行回发(页面在浏览器中完全刷新)UNLESS 我指示一个 ID 和 ClientIDMode="AutoID" 在 LinkButton 控件上。
我只是想做空
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:LinkButton ID="LinkButton1" OnClick="OnLinkClick" runat="server">Click me, no reload, I promise!</asp:LinkButton>
</ContentTemplate>
</asp:UpdatePanel>
以及.cs文件代码:
protected void Page_Load(object sender, EventArgs e)
{
//page reload things...
}
protected void OnLinkClick(object sender, EventArgs e)
{
//on click thigs...
}
每次我点击 LinkButton 时,触发的第一个断点是 PageLoad 断点,然后是 OnClick 断点。我认为使用 UpdatePanel 会避免这种行为。
我做错了什么,或者为什么我不应该期望 PageLoad 不会被调用?这是测试 LinkButton 单击是否重新加载页面的好方法吗?
即使您正在执行部分 post 返回,框架仍会执行包括 Page_Load 的页面生命周期。但是您只能在浏览器中对更新面板内的控件进行更改。
正如 techspider 提到的,您需要分配一个 post 后退触发器。所以你的例子应该是这样的。
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:LinkButton ID="LinkButton1" OnClick="OnLinkClick" runat="server">Click me, no reload, I promise!</asp:LinkButton>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="LinkButton1" EventName="Click" />
</Triggers>
</asp:UpdatePanel>
正如Clint B所说,代码隐藏中回发事件的处理是正常的。您可以使用两个标签测试您的 UpdatePanel,一个在 UpdatePanel 内部,一个在 UpdatePanel 外部:
<asp:Label ID="lbl1" runat="server" Text="Label 1" BackColor="Aqua" />
<asp:UpdatePanel ID="up1" runat="server">
<ContentTemplate>
<asp:Label ID="lbl2" runat="server" Text="Label 2" BackColor="Yellow" />
<asp:LinkButton ID="LinkButton1" runat="server" Text="Update, no reload!" OnClick="OnLinkClick" />
</ContentTemplate>
</asp:UpdatePanel>
LinkButton 的事件处理程序更新两个标签:
protected void OnLinkClick(object sender, EventArgs e)
{
lbl1.Text = DateTime.Now.ToString();
lbl2.Text = DateTime.Now.ToString();
}
如果部分刷新有效,对 lbl2
所做的更改在页面中可见,而 lbl1
仍显示其原始文本。
我发现当我在更新面板中使用 LinkButton 时,页面正在执行回发(页面在浏览器中完全刷新)UNLESS 我指示一个 ID 和 ClientIDMode="AutoID" 在 LinkButton 控件上。