我需要一个DropDownlist,它可以导致SelectedIndexChanged事件,但不回发(不需要页加载事件时,ddl索引更改)。
在堆栈中查看解决方案后,下面是我的代码:
<asp:UpdatePanel runat="server">
<ContentTemplate>
<asp:DropDownList ID="a" runat="server" OnSelectedIndexChanged="a_SelectedIndexChanged">
<asp:ListItem Text="a"></asp:ListItem>
<asp:ListItem Text="b"></asp:ListItem>
</asp:DropDownList>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="a" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
和C#代码:
public partial class TestApp : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
txtDate.Text = DateTime.Now.ToString("yyyy-MM-dd");
}
protected void a_SelectedIndexChanged(object sender, EventArgs e)
{
int a = 1;
}
}
但是put in a_SelectedIndexChanged中的断点从来没有被触发过,这是什么问题呢?
正如你所看到的,上面是一个公认的答案堆栈,那么它是如何不工作:How DropDownList's SelectedIndexChanged() works without PostBack?
编辑:虽然下面的答案正确地解释了page_load应该一直触发,但我仍然想知道为什么SelectedIndexChanged
从来没有被触发过。那么触发器中的EventName="SelectedIndexChanged"
是做什么的呢?
1条答案
按热度按时间n53p2ov01#
而一个更新面板(这篇文章的UP)将“ AJAX ”起来,并只回发页面的那一部分。(和代码背后的UP只能更新该UP中的控件?)
页面加载事件每次都将始终触发。
实际上,页面加载会在任何按钮单击、回发、更改事件或任何事件发生时触发。
因此,作为标准设计模式?
如果你的页面加载事件加载了一个下拉列表,列表框,网格视图等?
然后,您只希望代码在“真实的的”第一个页面加载时运行。
结果,我最近建立的200多个网页?
他们有这个:
因此,在上面的例子中,我正在加载一个带有一些数据的“中继器”。
然而,不管你是否使用UP?
你的页面加载代码,第一次必须做以上相当多。
如果不执行上述操作,那么每次都会触发一个简单的代码,比如加载一个下拉列表(组合框)。
如果你选择了一个组合框的值,那么点击页面上的一个按钮?
首先触发页面加载,然后触发按钮代码。但是,如果页面加载重新加载组合框,那么你将丢失你的选择。
所以,更新面板还是不更新?
每次都会触发页面加载事件-包括使用UP时。
因此,即使没有UP,如果你每次都加载数据和控件,那么你甚至不能真正构建一个工作的网页,因为对这些控件的任何更改都会被“吹”出来,并且每次都被重写。
所以,虽然UP的结果是什么“似乎”不是一个回邮?
事实上,这就是我们所说的部分回发。标准的页面生命周期确实发生了,但只有UP中的位和部分被回发到服务器,在这种情况下,,那么后面的代码当然只能改变/修改UP内部的控件(几乎是整个想法)。
所以,当UP将“消除”浏览器微调器,而它保持您当前的滚动位置在页面上?
这里不要搞错了--部分回发实际上是页面回发,但只是一个较小的回发,并且向用户显示没有发生回发。
因此,为下拉列表设置自动回发功能非常好。(您甚至不需要触发器,我建议您删除触发器,并将其放回自动回发功能中。
因此,UP并没有“消除”回发,而是对最终用户隐藏了这一点,在大多数情况下,它可以相当不错,快速,当然也不会刷新整个页面。但是,页面加载仍然会每次触发。
那么,要使代码正常工作,并且只在第一次启动时才启动,那么“真实的的”第一页加载量是多少呢?
那么你的代码应该是这样的:
现在,如果你真的不想任何形式的邮件回来?
然后你必须开始写一些JavaScript,并开始对一些Web方法进行 AJAX 调用。
现在, AJAX 调用肯定比UP“少”了一个回发,而UP又少了一个完整页面的回发。
如果你有一个“糟糕”的页面设计,其中UP不能使用,那么是的,你必须开始编写和添加客户端js代码,因此你可以设置一个 AJAX 调用,没有页面回发将发生。这是相当罕见的,UP不能使用,但ajax调用更好,但他们也需要显着更多的时间来设置,编写和采用。
但是,请记住, AJAX 调用服务器代码并不使用页面上的控件,因此,您必须返回值,然后让js代码更新页面上的控件。
所以,如果UP就足够了,那么这是最少的工作。奇妙的是,你不必编写和连接一大堆JavaScript代码来代替UP。
当然, AJAX 调用是最好的,但是它需要更多的代码、更多的时间,并且有更多的可移动部分(并且需要您的JavaScript技能)。通常这种额外的努力和时间(cost)不能证明采用 AJAX 调用页面是合理的,所以UP是一个很好的中间地带。与ajax调用相比,它是一个妥协,但它的工作量更少,因此,这往往是一个伟大的选择成本和时间明智的。换句话说,在大多数情况下,一个UP是“足够好”。