从客户端填充Dropdown的SelectedIndexChanged事件时不会触发该事件

时间:2015-02-05 12:12:29

标签: javascript c# jquery asp.net selectedindexchanged

我的页面上有一个下拉列表,我从客户端javascript代码填充。 SelectedIndexChanged不会触发。但是,当我从代码behide(.cs文件)填充我的下拉列表时,偶数被解雇了。

在从后面的代码填充下拉列表时,知道如何处理SelectedIndexChanged。我可以看到根据我的需要填充下拉列表。只有SelectedIndexChanged才被解雇。另请注意,下拉列表位于UpdatePanel内。这是一个原因吗?

这是我的html,javascript和代码背后的事件:

<asp:DropDownList ID="ddS" runat="server" OnSelectedIndexChanged="ddS_SelectedIndexChanged"
                AutoPostBack="True" Style="position: absolute; width: 50%;">

Javascript:

$('#ddS').append('<option value="' + $(this).val() + '">' + $(this).text() + '</option>');

CS

protected void ddS_SelectedIndexChanged(object sender, EventArgs e)
{
}

任何帮助将不胜感激。提前谢谢。

修改 我这样做的主要原因是: 我使用jquery ui js作为弹出窗口,它有一个多选下拉列表。由于弹出窗口中的按钮不能有服务器端事件,因此我在.cs文件中使用了对web方法的ajax调用。此方法将使用在多选下拉列表中选择的选项从数据库更新我的表。完成后,我想关闭弹出窗口并根据多选中选择的选项填充下拉列表。

我无法从代码后面填充我的下拉列表,因为web方法是一个静态方法,因此从该方法调用的任何方法都必须是静态方法。如果我编写静态方法,那么我无法从静态方法访问UI控件(我的下拉列表)。所以我希望我可以从JS填充它,然后触发我的indexchange事件以进行进一步的计算。

2 个答案:

答案 0 :(得分:2)

简短的回答是不要这样做。这不是ASP.NET服务器控件的设计工作方式,您最终将创建一个Rube Goldburg使其工作。详情如下:

ASP.NET内置了一个安全功能(事件验证),以防止在页面生命周期的渲染阶段之后发布的数据不存在于控件中。如果发生这种情况,将抛出ArgumentException。您可以在Page_Load函数中禁用事件验证或覆盖渲染并粘贴大量代码,但我不推荐它。

那为什么所有这一切都会发生? ASP.NET服务器控件使用ViewState尝试创建状态,如桌面应用程序中的状态(Windows Forms =&gt; Web窗体,看看他们在那里做了什么)。如果ViewState不知道您添加到<options>的{​​{1}},则会感到不安。一些解决方案是:

1)在服务器端填充DropDownList(除非你有充分的理由不这样做)并让ASP.NET Framework按照预期的方式行事(你可能也有将EnableViewState = true属性添加到DropDownList控件,虽然我相信它是默认值)。如果DropDownList位于更新面板中,则会从面板触发的PartialPostBack更新ViewState,以便ViewState在您获得无闪烁更新时保持满意。

2)忘记服务器端代码,使用JavaScript创建并填充<select>控件。

a)您可以绑定JavaScript事件侦听器,以在更改所选项目时更新隐藏字段。然后在PostBack上,您可以读取隐藏字段的值以获取最后一个选定项的值。

b)如果需要将这些更改与服务器端代码进行通信,则可以在选择更改时绑定JavaScript事件侦听器以运行POST或GET(AJAX请求)。你从来没有真正说过你的目标......

问题更新后编辑:

我能想到三种方式:

1)删除ASP <select>控件并使其成为常规HTML DropDownList控件。为控件命名(使用name属性而不仅仅是id属性)。例如:

select

在POST上,HttpContext.Current.Request.Form是一个NameValueCollection,它将包含POSTed数据的键值对。您应该能够使用您为<select name='options'></select> 控件提供的名称从您的选择控件中获取所选项目:

select

选项现在将是所选值的列表。如果您需要启用AJAX(无页面刷新),请将其包装在var options = HttpContent.Current.Request.Form["options"].Split(',');

2)将所选项目写入隐藏字段,并在POST上从隐藏字段中收集值。

3)向Web方法触发POST,更新会话对象,然后可以从类成员/方法后面的非静态代码中读取。 Web方法修饰有一个可选属性,用于启用会话:

UpdatePanel

答案 1 :(得分:-1)

通常,您需要确保在所有DOM操作之后将事件处理程序(SelectedIndexChanged)设置为。在你的情况下,你通过jQuery的append方法追加你的html元素。不幸的是,无法向该方法添加回调。 但是,定时器“1ms”的settimeout总是将函数置于调用堆栈底部的settimeout中。

$('#ddS').append('<option value="' + $(this).val() + '">' + $(this).text() + '</option>');
setTimeout(function() {
  // set listener here
  // e.g. $("#ddS option").change(function(){ 
  //   ddS_SelectedIndexChanged()
  // });
}, 1);