从客户端填充下拉列表的SelectedIndexChanged事件不会触发 - javascript

我的网页上有一个下拉菜单,该菜单是从客户端JavaScript代码填充的。 SelectedIndexChanged不触发。但是,当我从代码隐藏(.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进行弹出,它具有多选下拉列表。由于弹出窗口中的按钮无法发生服务器端事件,因此我已使用ajax调用.cs文件中的Web方法。此方法将使用在多选下拉列表中选择的选项来更新数据库中的表。完成后,我要基于多选中选择的选项关闭弹出窗口并填充一个下拉列表。

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

参考方案

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

ASP.NET具有内置的安全功能(事件验证),以防止发布页面生命周期的“渲染”阶段之后控件中不存在的数据。如果发生这种情况,将引发ArgumentException。您可以禁用事件验证或重写Render,并在Page_Load函数中粘贴大量代码,但我不建议这样做。

那么,为什么所有这些事情都会发生呢? ASP.NET Server控件使用ViewState来尝试创建类似于桌面应用程序中的状态的状态(Windows窗体=> Web窗体查看其在其中所做的工作)。如果ViewState不了解您添加到<options><select>,则会感到不高兴。一些解决方案是:

1)在服务器端填充DropDownList(除非您有很好的理由不这样做),然后让ASP.NET Framework进行预期的操作(您可能还必须将EnableViewState = true属性添加到DropDownList中控制,尽管我相信它是默认设置)。如果DropDownList在更新面板中,则ViewState是由面板触发的PartialPostBack更新的,因此当您获得无闪烁的更新时,ViewState仍然很高兴。

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

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

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

在问题更新后进行编辑:

我可以想到三种方式:

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

<select name='options'></select>

在POST上,HttpContext.Current.Request.Form是一个NameValueCollection,它将包含POSTed数据的键-值对。您应该可以通过使用select控件的名称从select控件中获取所选项目:

var options = HttpContent.Current.Request.Form["options"].Split(',');

现在,选项将是所选值的列表。如果您需要启用AJAX(不刷新页面),请将其包装在UpdatePanel中。

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

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

[WebMethod(EnableSession = true)]

ddl在服务器中未更新-asp.net - javascript

我在ASP.NET c#上工作。我有一个DropDownList。 (runat =“ server”)在$ {document).ready上,我更新了它的值:$(document).ready(function () { document.getElementById("ddl").value = "abc"; ……

.NET C#Webbrowser填充输入,不带ID或类名 - javascript

我需要在网络浏览器中填写一个输入,但这不起作用。我认为必须使用name属性来完成,但是怎么做呢?foreach (HtmlElement login in webBrowser1.Document.GetElementsByTagName("input")) { if (login.GetAttribute("name"…

获取JavaScript值到C#字符串 - javascript

                        是否可以在C#中执行类似的操作?该值为“ 10/05/2014”string jsValue = javascript("$('#EstimatedStartDate').val()"); 参考方案 您能否更详细地阐明您要做什么。看来您正在尝试从javascript(客户…

ASP.NET-如何更改JSON序列化的方式? - javascript

我正在使用ASP.NET通过以下查询返回Json文件:public ActionResult getTransactionTotals(int itemID) { DBEntities db = new DBEntities(); var query = from trans in db.Transactions // Linq query removed …

ASP.NET MVC中应为DataTable返回哪种数据? - javascript

我想为DataTable中的每个页面创建动态加载信息。我正在尝试遵循以下示例:https://www.datatables.net/manual/server-sidehttps://www.datatables.net/manual/data来自示例的代码:$('#example').DataTable( { serverSide: t…