如何在用户控件上维护viewstate

时间:2010-02-26 09:53:29

标签: asp.net listbox viewstate

我有一个ASP页面,它使用两个列表框和第三方控件(Fluent.ListTransfer)将值从一个列表传输到另一个列表。相当标准的东西:

<td>
    <asp:ListBox ID="ListBoxAvailable" Runat="server"  
        SelectionMode="Multiple" EnableViewState="true">
    </asp:ListBox>
</td>
<td style="vertical-align: middle">
    <a href="#" onclick="<%= ListTransfer1.ClientMoveSelected %>" ><img src="img/RightArrow.jpg" alt=">>"/></a>
    <br />
    <a href="#" onclick="<%= ListTransfer1.ClientMoveBackSelected %>"><img src="img/LeftArrow.jpg" alt="<<"/></a>

</td>
<td>
    <asp:ListBox ID="ListBoxSelected" Runat="server"  
        SelectionMode="Multiple" EnableViewState="true">
    </asp:ListBox>
</td>

在Controls Page_load事件中,我使用一些sql设置'available'和'selected'框的内容:

    protected void Page_Load(object sender, EventArgs e)
    {

        if (IsPostBack)
            return;

        // Some code to work through a recordset, adding values 
        // to the selected or available list boxes

我假设在回发时,视图状态会处理列表框的状态,由用户更改(毕竟,它们是标准的ASP控件)。但是,如果我进行回发,两个列表框都是空白的。

在回发之间维护列表框状态的正确方法是什么?

感谢您的帮助

赖安

2 个答案:

答案 0 :(得分:2)

ViewState就像是客户端的“间谍”。只要客户端发生更改,ViewState就会向服务器报告(读取:PostBack)更改,以便服务器可以重新处理页面。

不幸的是,如果我们使用客户端脚本更改像ListBox这样的控件的内容,ViewState就看不到它。

我猜你的Fluent.ListTransfer是客户端功能。

一些解决方案:

  

仅在ViewState中存储列表框   所选项目(我猜只有   index),而不是列表中的所有项目,   所以它只知道恢复   选中的项目,而不是整个列表。是   有点奇怪,但是逻辑。至   在ViewState中保存所有项目   可以编写一个新的ListBox派生自   ListBox或HtmlSelect,但你必须   处理的同时   列表中的项目的可能性   框在客户端使用修改   javascript代码。


  

当一个页面没有回复时   列表框中的项目将被发送回   服务器除了那些   在客户端上选择。这使得   当你想到它时感觉到。忘记   关于viewstate和所有其他的。您   可以选择多个项目,所以全部   您添加到列表框2的项目   地选择。


  

另一种解决方法,但不是这样   优雅。基本的想法是记录   一个LISTBOX上的所有项目   控制,并重新填充列表框   每次使用控件的值   正在发布的页面。希望   有人可以拿出一些东西   更好:

     
      
  1. 在您的网页中输入HIDDEN输入。记得放RUNAT = SERVER   属性,以便您可以参考   您从ASP.NET代码输入的内容   后面。

  2.   
  3. 在您的Javascript中,每当您更改一个列表框的内容时,   连接所有值 - 使用a   separator - 并将值放入   你的隐藏输入。

  4.   
  5. 在Page_Load代码中,输入代码以读取HIDDEN输入,   将值分开,并填写   列表框。

  6.   

希望这一切都有帮助...

答案 1 :(得分:0)

如果我正确理解您的代码,您将客户端的ListItem从一个ListBox移动到另一个ListBox。但ListBoxes不提交他们的全部内容 - 只提交选定的项目。所以必须保持这一点。我不知道,如果Fluent.ListTransfer会为你做这件事。