我的网页上有一个下拉菜单,该菜单是从客户端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…