我的页面上有一个下拉列表,我从客户端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事件以进行进一步的计算。
答案 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);