客户端服务器数据共享的问题,请高高手帮忙解决。
我先说下我的需求:一个单据编辑页面,分为表头和明细GridView(GridView显示该单据下的产品);点【新增】弹出产品新增页面,选择产品并添加多个材料后返回到单据页面,将得到的数据添加到DataTable并无刷新显示明细到GridView。
我现在的做法:
页面中private static定义DataTable,将DataTable绑定到UpdatePanel中的GridView,选择产品后将得到的数据保存到Session,返回页面后前端通过PageMethods调用后端函数,函数中将Session中的数据再更新到DataTable,再回调前端的代码重新绑定GridView进行刷新,现在功能上能够实现,但是有个重大问题就是:A、B用户同时登陆,A添加产品一后,B添加产品二,A再添加后刷新就有3个。
请大家指教是哪个地方出了问题(我怀疑是private static的问题,但如果不是静态类在WebMethod函数中就无法引用),要怎么解决呢,万分感谢!!! AJAX GridView JS调用后台 --------------------编程问答-------------------- 可以把DataTable放到session中 --------------------编程问答-------------------- static在所有用户实例中共享。你可以使用Session
非要使用static,应该做成字典,为每个用户id保存一个DataTable。 --------------------编程问答-------------------- --------------------编程问答-------------------- 谢谢jshi123
放在Session中效率怎么样呢。另外有没有前台直接调用后台函数的方法,WebMethod中不能操作页面控件。 --------------------编程问答-------------------- jshi123:请教使用static,怎么样做成字典,为每个用户id保存一个DataTable呢? --------------------编程问答-------------------- 再一顶下子! --------------------编程问答-------------------- 放到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(); --------------------编程问答-------------------- 那请问触发按钮怎么样传参以及根据后台返回结果进行回调呢?谢谢! --------------------编程问答-------------------- jshi123:你好,可以加你QQ向你请教吗,谢谢! --------------------编程问答-------------------- 传递参数的话可以放在一个HiddenField的隐藏域中。
按钮处理程序不返回任何结果,但是它对其它控件的修改都会反映到前台中,比方对textbox重新赋值,重新绑定gridview,更新hiddenfield值等,只要这些控件在UpdatePanel范围内。
可以把这种方式看成是普通的postback回调(虽然它是用ajax技术实现的),它会首先执行Page_Load事件,然后再是button_click事件,从编程角度看跟普通回调没什么两样,只是页面刷新范围限制在UpdatePanel中。
这种方式和直接用ajax回调的最大区别就是它是把ViewState值一起post回来,这样在后台就可以完整还原页面状态,得到xxxPage这个对象,你就可以访问其中的实例成员了。
所以UpdatePanel方式和直接ajax理念上有很大区别。UpdatePanel是重度封装的、重量级相对比较大(需要传递viewstate和执行一系列page生命周期)。而ajax是轻量级的,但是它当然不能访问在page生命周期内生成的任何实例。
补充:.NET技术 , ASP.NET