前言:第一次真正使用JavaScript + jQuery,所以我的问题可能源于缺乏理解。
我有一些非常简单的 Javascript 将元素从一个列表框移动到另一个列表框:
$('[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 并打印每个项目,假设看到我添加的任何新项目。遗憾的是,我只获得了数据绑定到列表的原始项目。我的 DataBind 不会意外出现在 IsPostBack 部分中,所以我知道我不是简单地重新绑定。
我假设我在这里错过了一步。我需要做些什么来告诉 .NET 实际更新 ListBox 的内容吗?猜测 jQuery 所做的一切纯粹是为了美观,但我不知道如何将其更改提交给我的控件。
这实际上是一个限制,因为 .NET 假定一切都保持其最初提供的方式。如果站点呈现一个文本框,它就会知道该值可能已更改,并根据 POST 数据更新其值。例如,如果它呈现一个禁用的文本框,它“知道”该值不能更改,因此,即使 javascript 启用了该文本框,您也将无法获取更改后的文本。
同样的事情也发生在这里。 .NET 假设它已经知道哪些项目属于哪个列表。所选值始终发布在 Request.Form 集合中,因此即使 .NET 列表框控件中的值没有更改,您仍然可以通过这种方式获取值(Request.Form[myListBox.ClientID]
),但在任何列表框中未选择的值不会作为表单数据传递,因此从技术上来说,服务器实际上无法在提交列表框之前知道您以何种方式篡改了列表框。
你要做的不是很漂亮,但这是唯一的方法。在两个移动数据的函数中,您必须确保它们也更新隐藏字段。它可以是每个列表框的一个隐藏字段,也可以是包含所有列表框项目的逗号分隔值的一个隐藏字段,在所有列表框的管道分隔列表中,或者您想要表示数据的任何一种方式,但在列表的末尾有一天,您确实必须手动制作不同列表框中数据的字符串表示形式,您可以在服务器端获取该字符串,然后使用新的相关数据重新绑定列表框。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)