ASP.Net ListBox值在jQuery操作后没有发布更改?

时间:2010-09-03 16:29:33

标签: asp.net jquery listbox postback fiddler

我有一个带有两个ListBox组件的ASP.Net页面,在浏览器中呈现为<select>列表。我正在使用jQuery通过操作DOM将元素从一个列表移动到另一个列表。然后我用鼠标选择所有元素并回发表单。这样,所有列表元素都以表单形式发布。

当我提交表单时,在我的button_save()事件处理程序中,Request.Form [<<listbox ID>>]值是正确的。但是ListBox控件本身,特别是它们的Items集合,并不反映我的更改。

我还使用Fiddler来修改选择项并提交表单。与上面相同,ListBox值没有区别,尽管Request.Form值是。谁会知道发生了什么或我正在做出什么不正确的假设?

3 个答案:

答案 0 :(得分:1)

我认为问题在于服务器构造一个ListBox对象,该对象不知道对客户端选择框所做的更改。也就是说,它使用ASP.NET标记来构建项目列表,而不是从请求中提交的信息。

除了直接访问Request.Form值之外,我不知道有任何解决方法。

答案 1 :(得分:1)

我认为根本问题是:ListBox的选项存储在页面的viewstate中。当您使用客户端javascript / jquery修改列表的内容时,这些更改不会反映在视图状态中。因此,当您回发时,ASP.NET使用视图状态为您的代码隐藏构建列表,并且您的客户端更改将丢失。

解决此问题的一种方法是通过回发操作列表的内容,而不是客户端(javascript / jquery)。通过这样做,列表框的所有更改都会合并到视图状态中,因此每个回发都将保持一致。

我是jquery的忠实粉丝(比回发或MS-Ajax /部分回发更多),所以我完全理解这种方法可能不太吸引人。不幸的是,这是我现在唯一能想到的。也许其他stackoverflow'ers将有更好的选择。

答案 2 :(得分:0)

拉里,如果你还没有找到解决方案,我就会这样做。

正如其他人所说,由于您正在更改DOM客户端,因此更改不会反映到ViewState,因此您无法从代码隐藏中访问新值。

作为一种解决方案,您可以创建隐藏值,并在每次使用jQuery更改列表时将其值设置为列表的序列化形式(组合值/文本对)。然后,您可以从后面的代码中访问隐藏的值,最后反序列化它以获取所有更改。实际上,该方法非常简单。