两个listbox,实现选项左右移动(jquery实现)。但是在保存时提示:回发或回调参数无效。经过网上查询估计:每个asp.net控件都有个隐藏域保存它的值。页面中直接用jquery把一个选项直接从listbox1移动到listbox2后,隐藏域的值与listbox本身不对应了。所以报错。
请教有经验的朋友们,大家是如何处理这个问题的。如果通过别的ajax方法就算了,jquery实在是好用,不想放弃。我想这应该是jquery+aspx的一个设置技巧,希望大家多多指教。

解决方案 »

  1.   

    LISTBOX,到客户端也是TABLE, 直接用TABLE不就行了.
      

  2.   

    设置 <pages enableEventValidation="false"/>
    //左移或右移
    function MoveOption(fromSel,toSel)
    {
       var fromOp=fromSel.options;
       var toOp=toSel.options;
       var selectedFlag=false;
       for(var i=0;i<fromOp.length;i++)
       {
          if(fromOp[i].selected)
          {
             selectedFlag=true;
             var selectedOp=document.createElement("option");
             selectedOp.text=fromOp[i].text;
             selectedOp.value=fromOp[i].value;
             
             toSelLength=toOp.length;
             toSel.options.add(selectedOp,toSelLength);
             
             fromSel.options.remove(i);
             i--;
          }
       }
       if(!selectedFlag)
       {
          alert("请选择一项!");
          return;
       }
    }
      

  3.   

    其实自从我使用sivlerlight来自动处理dom element和监听其事件触发,我就不再写javascript代码了,基本上不回复这类问题了。不过这个东西在我用silverlight来删除javascript的时候也会遇到,就跟你讨论一下。实际上,当你设计asp.net程序的时候,我们都知道如果没有设置到items中的内容就不能被选择,因此如果你原来在后台asp.net中期望从ListBox中获取结果,那么最初的逻辑就过分选择怪异方式了。改为比较顺的方法,你可以放两个HiddenField,分别获取两个<select />最终所有option值。并且注册javascript,使得在Form的submit时将两个ListBox值传递给两个Hiddel。例如:if (!IsPostBack)
    {
        var sc = this.Page.Form.Attributes["onsubmit"];
        if (sc == null)
            sc = "return true;";
        this.Page.Form.Attributes["onsubmit"] =
            string.Format("process({0},{1},{2},{3});", 
                 ListBox1.ClientID, HiddelField1.ClientID,
                 ListBox2.ClientID, HiddelField2.ClientID)
            + sc;   //调用客户端方法process,然后调用原来的onsubmit。
    }
    这样asp.net设计时就没有自相矛盾。
    在客户端方法process,参数中已经引用四个客户端元素,在你处理完之后,可以将<select />的value属性仍然恢复为最初的值。在后台,处理了两个HiddenField的ValueChanged事件之后,自然会重新设置两个ListBox的Item。