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

Asp.net 使用jQuery.appendTo后未添加到ListBox的项,asp.net,jquery,Asp.net,Jquery,前言:第一次真正使用JavaScript+jQuery,所以我的问题可能是因为缺乏理解 我有一些非常简单的Javascript将元素从一个列表框移动到另一个列表框: $('[id$=AddRole]').click(function () { $('[id$=MissingRoles] option:selected').appendTo('[id$=Roles]'); return false; }); $('[id$=RemoveRole]').click(function ()

前言:第一次真正使用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)部分,我提取“Roles”ItemCollection并打印每个项,假设看到我添加的任何新项。遗憾的是,我只得到了数据绑定到列表中的原始项。我没有在IsPostBack部分意外地进行数据绑定,所以我知道我不是简单地重新绑定


我想我错过了一步。我需要做些什么来告诉.NET实际更新列表框的内容吗?猜测jQuery所做的一切纯粹是为了美观,但我不知道如何将它的更改提交给我的控件。

这实际上是一个限制,因为.NET假定一切都按照最初的方式进行。如果站点呈现一个文本框,它将知道该值可能已更改,并根据POST数据更新其值。例如,如果它呈现一个禁用的文本框,它“知道”该值不能更改,因此,即使javascript启用了该文本框,您也无法获取更改后的文本

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


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

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


我建议只使用UpdatePanel包装控件。Asp.net已经内置了强大的Ajax类型功能,无需完全回发。它们的逻辑控制着所有名称的混乱和视图状态。

感谢您的澄清。我将不得不把它作为书签,以备将来遇到挫折时使用。我很可能会按照马克的建议去做,因为这正是我最初的打算。我必须说,我坚决不建议这样做,尽管这当然是你自己的选择。我认为UpDATEPANELS是绝对憎恶的。您知道ajax.net实际上根本不是异步的吗?更糟糕的是,整个页面实际上是呈现的,尽管只是相关的部分被发回。您还必须传递整个viewstate,它可能比当前操作所需的堆多。而且,最糟糕的是,每次更改都必须进行服务器调用,而不是在回发中传递信息。具有讽刺意味的是,我想使用jQuery,因为在过去,UpdatePanel对我来说有点慢——我想这次我会使用更少的开销,直接使用功能强大的库。我想不会吧!我会按照你的建议去做,因为我已经熟悉了它的工作原理。我知道其中涉及的开销,但是我已经用UpdatePanel获得了非常好的性能结果,请明智地定位它们。JQuery通常非常适合这样的东西,但我强烈建议不要在这里使用它,因为隐藏字段方法会很麻烦,开发人员在将来查看您的代码时也会遇到这种情况。