我先说下我的需求:
一个单据编辑页面,分为表头和明细GridView(GridView显示该单据下的产品);点【新增】弹出产品新增页面,选择产品并添加多个材料后返回到单据页面,将得到的数据添加到DataTable并无刷新显示明细到GridView。
我现在的做法:
页面中private static定义DataTable,将DataTable绑定到UpdatePanel中的GridView,选择产品后将得到的数据保存到Session,返回页面后前端通过PageMethods调用后端函数,函数中将Session中的数据再更新到DataTable,再回调前端的代码重新绑定GridView进行刷新,现在功能上能够实现,但是有个重大问题就是:A、B用户同时登陆,A添加产品一后,B添加产品二,A再添加后刷新就有3个。
请大家指教是哪个地方出了问题(我怀疑是private static的问题,但如果不是静态类在WebMethod函数中就无法引用),要怎么解决呢,万分感谢!!!AJAXGridViewJS调用后台

解决方案 »

  1.   

    static在所有用户实例中共享。你可以使用Session
    非要使用static,应该做成字典,为每个用户id保存一个DataTable。
      

  2.   

    谢谢jshi123
    放在Session中效率怎么样呢。另外有没有前台直接调用后台函数的方法,WebMethod中不能操作页面控件。
      

  3.   

    jshi123:请教使用static,怎么样做成字典,为每个用户id保存一个DataTable呢?
      

  4.   

    放到session和用静态变量差不多。现在的问题是你需要为每个用户维持一份DataTable,这样用户多的话,占用内存就会大,这个避免不了,放在哪里都一样。访问后台的非静态属性方法:
    在UpdatePanel里放一个隐藏的Button,需要回调后台时,触发这个按钮的click事件就可以。例如:<asp:UpdatePanel >
        <ContentTemplate>
           
          <asp:Button runat="server" ID="btn1" OnClick="CallBackEndMethod" style="display:none" />
        </ContentTemplate>
    </asp:UpdatePanel>protected void CallBackEndMethod(object sender, EventArgs e)
    {
         。
    }
    然后可以用js来触发调用:
    getElementById('btn1').click();
      

  5.   

    jshi123:你好,可以加你QQ向你请教吗,谢谢!
      

  6.   

    传递参数的话可以放在一个HiddenField的隐藏域中。
    按钮处理程序不返回任何结果,但是它对其它控件的修改都会反映到前台中,比方对textbox重新赋值,重新绑定gridview,更新hiddenfield值等,只要这些控件在UpdatePanel范围内。可以把这种方式看成是普通的postback回调(虽然它是用ajax技术实现的),它会首先执行Page_Load事件,然后再是button_click事件,从编程角度看跟普通回调没什么两样,只是页面刷新范围限制在UpdatePanel中。这种方式和直接用ajax回调的最大区别就是它是把ViewState值一起post回来,这样在后台就可以完整还原页面状态,得到xxxPage这个对象,你就可以访问其中的实例成员了。所以UpdatePanel方式和直接ajax理念上有很大区别。UpdatePanel是重度封装的、重量级相对比较大(需要传递viewstate和执行一系列page生命周期)。而ajax是轻量级的,但是它当然不能访问在page生命周期内生成的任何实例。