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

 

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

 

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

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

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

 

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

            LiteralInputData.Text = null;
            
if(IsPostBack)
            
{
                
if (Request.Form.Get("__EVENTTARGET"== "saveData")
                
{
                    LiteralInputData.Text 
= Request.Form.Get("__EVENTARGUMENT");
                }

            }

 

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

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

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

 posted on 2004-10-22 13:09  一切由.NET开始  阅读(2424)  评论(2编辑  收藏  举报