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

 

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

 

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

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

动态创建的 HTML 控件提交后数据丢失问题及解决ButtonSave.Attributes.Add("onclick""__doPostBack('saveData', document.all.item('inputData').outerHTML)");动态创建的 HTML 控件提交后数据丢失问题及解决

 

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

动态创建的 HTML 控件提交后数据丢失问题及解决            LiteralInputData.Text = null;
动态创建的 HTML 控件提交后数据丢失问题及解决            
if(IsPostBack)
            }

 

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

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

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

相关文章:

  • 2021-12-05
  • 2021-05-23
  • 2022-12-23
  • 2021-11-27
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-06-25
  • 2021-05-27
  • 2021-07-03
  • 2023-03-15
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案