webforms:在javascript选项中动态添加到下拉列表中

我正在开发一个asp.net webforms应用程序。 我的页面由2个下拉列表组成。
在ddl1上的每个选择中,我想通过javascript动态地将ddl1的所选元素添加到ddl2。 默认情况下,首次加载页面时,ddl1由3个元素(a,b,c)组成,ddl2仅由一个元素(a)组成。

 function ddl1_handler() { var ddl2 = document.getElementById("ddl2"); var newOption = document.createElement("option"); newOption.text = document.getElementById("ddl1").value; newOption.value = document.getElementById("ddl1").value; ddl2.add(option); }       

这是我的code_behind代码:

 private List choices = new List() { "a", "b", "c"}; protected override void Render(HtmlTextWriter writer) { foreach (var choice in choices) { Page.ClientScript.RegisterForEventValidation(ddl2.UniqueID, choice); } base.Render(writer); } protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { this.ddl1.Items.Clear(); foreach (var choice in choices) { this.ddl1.Items.Add(new ListItem(){ Text = choice, Value = choice}); } this.ddl2.Items.Clear(); this.ddl2.Items.Add(new ListItem(){ Text = choices.First(), Value = choices.First()}); } } protected void Button1_Click(object sender, EventArgs e) { var selectedValue = this.ddl2.selectedValue; } 

使用以下代码,当我第一次加载页面时,我的ddl1由a,b,c和我的ddl2组成。 然后我在我的ddl1上选择b,这个元素被添加到我的ddl2中。 我在ddl2上选择了这个元素,然后点击我的按钮。 但是当我到达我的button1_click处理程序时,我选择的值仍然是,我不明白。

插入客户端代码的项目不会保留在代码隐藏中。 您可以设置一个涉及隐藏字段的机制来获取值,但我认为最简单的解决方案是在代码隐藏中添加项目并使用UpdatePanel来避免刷新整个页面。

以下是如何使用它,显示如何通过面板内部或外部的控件触发更新:

   ...           

由于默认情况下UpdatePanel的属性ChildrenAsTriggers为true,因此ddl1的选择将更新面板。 另一方面, ddl3将具有类似的效果,因为它被注册为UpdatePanel的触发器。

ddl1ddl3都可以使用以下事件处理程序:

 protected void ddl_SelectedIndexChanged(object sender, EventArgs e) { DropDownList ddl = sender as DropDownList; ListItem item = ddl.SelectedItem; ddl2.Items.Add(new ListItem(item.Text, item.Value)); ddl.Focus(); } 

请注意, ClientIDMode="Static"已被删除,因为它与UpdatePanels不能很好地混合。

我在标记中包含了ScriptManager声明作为提醒,因为在使用UpdatePanel时需要它。