使用jQuery .appendTo后未添加到ListBox的项目

前言:第一次真正使用JavaScript + jQuery,所以我的问题可能源于缺乏理解。

我有一些非常简单的Javascript将元素从一个ListBox移动到另一个:

$('[id$=AddRole]').click(function () { $('[id$=MissingRoles] option:selected').appendTo('[id$=Roles]'); return false; }); $('[id$=RemoveRole]').click(function () { $('[id$=Roles] option:selected').appendTo('[id$=MissingRoles]'); return false; }); 

这非常有效 – 当我点击一个按钮时,一个列表中的项目会像您期望的那样移动到另一个列表中。 太棒了! 然后单击一个按钮强制回发。 在我的代码的if(IsPostBack)部分,我提取’角色’ItemCollection并打印出每个项目,假设看到我添加的任何新项目。 可悲的是,我只将DataBound的原始项目列入清单。 我没有意外地在IsPostBack部分中使用我的DataBind,因此我知道我不仅仅是重新绑定。

我假设我在这里错过了一步。 有什么我需要做的告诉.NET实际更新ListBox的内容吗? 猜测jQuery正在做的事情纯粹是审美的,但我对如何将其更改提交到我的控件感到茫然。

这实际上是一个限制,这是因为.NET假定所有内容都保留了它首次提供的方式。 如果站点呈现文本框,它将知道该值可能已更改,并根据POST数据更新其值。 例如,如果它呈现禁用的文本框,它“知道”该值无法更改,因此,即使javascript启用了文本框,您也无法获取更改的文本。

同样的事情发生在这里。 .NET假设它已经知道哪些项属于哪个列表。 所选的值始终在Request.Form集合中发布,因此即使.NET列表框控件中的值没有更改,您仍然可以以这种方式获取值( Request.Form[myListBox.ClientID] ),但未在任何列表框中选择的值不会作为表单数据传递,因此实际上技术上无法让服务器知道在提交列表框之前您以何种方式篡改列表框。

你要做的不是很漂亮,但这是唯一的方法。 在您移动数据的两个函数中,您必须确保它们还更新隐藏字段。 它可以是每个列表框的一个隐藏字段,或者是包含所有列表框项的逗号分隔值的一个隐藏字段,在所有列表框的管道分隔列表中,或者您想要表示数据的任何方式,但是在结尾处那一天,你真的必须手动创建一个字符串表示不同列表框中的数据,你可以在服务器端获取,并用于重新绑定列表框与新的相关数据。

如果您使用的是asp.net,我相信这是因为您没有操纵viewstate,这对于要回发的回发上的asp.net服务器很重要。

我建议只使用UpdatePanel来包装你的控件。 Asp.net已经内置了很棒的Ajax类型function,不需要完整的回发function。 他们的逻辑控制所有名称mangling和viewstate。