前言:第一次真正使用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)部分中,我提取“Roles”ItemCollection并打印出每一项,假设看到的是我添加的任何新项。遗憾的是,我只得到了列表中DataBound的原始项目。我的DataBind不会意外地放在IsPostBack部分,所以我知道我不是简单地重新绑定。
我想我在这里漏掉了一步。要让.NET实际更新ListBox的内容,我需要做些什么吗?我猜无论jQuery做什么纯粹是美观的,但我不知道如何将它的更改提交到我的控件中。
发布于 2009-11-19 17:08:11
这实际上是一个限制,这是由于.NET假设所有内容都保持最初的状态。如果站点呈现一个文本框,它将知道该值可能已经更改,并根据POST数据更新它的值。例如,如果它呈现一个禁用的文本框,它“知道”该值不能被更改,因此,即使javascript启用了文本框,您也无法获取更改后的文本。
同样的事情也在这里发生。.NET假设它已经知道哪些项目属于哪个列表。选定的值始终发布在Request.Form集合中,因此即使.NET列表框控件中的值没有更改,您仍然能够以这种方式(Request.Form[myListBox.ClientID]
)获取这些值,但是没有在任何列表框中选择的值不会作为表单数据传递,因此从技术上讲,服务器实际上没有办法在提交列表框之前知道您是以何种方式篡改了列表框。
你要做的不是很漂亮,但这是唯一的方法。在这两个移动数据的函数中,您必须确保它们还会更新隐藏字段。它可以是每个列表框的一个隐藏字段,也可以是一个包含所有列表框项目的逗号分隔值的隐藏字段,在所有列表框的竖线分隔列表中,或者以任何您想要的方式来表示数据,但最终,您真的必须手动为不同列表框中的数据创建一个字符串表示,您可以在服务器端拾取该字符串,并使用它将列表框与新的相关数据重新绑定。
发布于 2009-11-19 17:08:12
如果你使用的是asp.net,我相信这是因为你没有操纵视图状态,而这对于回发的asp.net服务器来说是很重要的。
我建议简单地使用UpdatePanel来包装你的控件。Asp.net已经内置了很棒的Ajax类型的功能,不需要完整的回发。它们的逻辑控制着所有的名称拆分和视图状态。
https://stackoverflow.com/questions/1764864
复制