动态创建的 HTML 控件提交后数据丢失问题及解决

最近在做的一个B/S项目中需要绘制报表, 由于很多报表的表头非常复杂,, 而且许多列都是动态创建的,DataGrid 实现起来非常麻烦. 考虑了一下, 所有的报表都用 XML + XSLT 动态创建, 虽然 XSLT 的语法有些累赘, 并且有很多先天的不足, 但是整体看来着实非常方便。40多张报表, 大概2天半就写完了。

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

用户输入的一些表单由于也是报表的这番形式,一时兴起,全部都用 XML+XSLT 生成。因为页面的 Input 控件也是动态创建的(在 XSLT 这里创建的还不是服务器控件, 而是普通的 HTML 控件),麻烦也就随之而来了hitwall.gif。由于 Input 控件只是普通的 HTML 控件,而且是动态创建的,所以每次用户提交之后都要重新绘制一遍,这样很显然用户输入并提交的数据全都丢失了!看来需要首先保存用户输入的数据了。逐个读取 Input ,然后逐个恢复,显然异常麻烦。最后想到可以在客户端,直接把“呈现用户输入界面”的 HTML 代码直接提交到服务器上。提交之后再把这个 HTML 代码写回到页面上去。

 

1,  把“呈现用户输入界面的HTML代码” 放到一个名为 inputData <SPAN> 标签中。

2,  在提交按钮事件中把 document.all.item('inputData').outerHTML 保存到一个隐藏字段。我直接使用的是 __doPostBack ,当然也可以自己写

None.gif ButtonSave.Attributes.Add( " onclick " " __doPostBack('saveData', document.all.item('inputData').outerHTML) " );None.gif

 

3,  在服务器端就可以得到这段 HTML 代码了

None.gif             LiteralInputData.Text  =   null ;
None.gif            
if (IsPostBack)
ExpandedBlockStart.gifContractedBlock.gif            
dot.gif {
InBlock.gif                
if (Request.Form.Get("__EVENTTARGET"== "saveData")
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    LiteralInputData.Text 
= Request.Form.Get("__EVENTARGUMENT");
ExpandedSubBlockEnd.gif                }

ExpandedBlockEnd.gif            }

 

4, 正象你在3里面看到的那样, Web 页面增加一个 Literal 控件 LiteralInputData, 直接把得到的 HTML 代码写回去就好了.

5, 因为提交的数据是 HTML 代码 ,默认的 WEB 页面是不允许提交此类数据的所以还需要在ASPX 页面中的 <%@ Page language="c#"..%>里面增加 validateRequest=false 这一句。

测试了一下, OK 如果不把数据提交到服务器上去也可以保存在 userData 中,但是只有IE6 支持。总觉得上面的方法有算是个小小的hack,不太妥,还有什么更好的方案呢?

转载于:https://www.cnblogs.com/zhumi/archive/2004/10/22/55435.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值