ASP.NET AJAX Advance Tips & Tricks (10) 解决使用AJAX Extender时的页面导出(Word/Excel)问题(Extender control 'XXX'

前言:

有客户问到这么个问题:我们可以使用Response容易地将ASP.NET页面导出为Excel或Word。然而,如果有AJAX Control Toolkit的Extender在页面上的话,则会发生错误(Extender control 'XXX' is not a registered extender control)。我搜索了一下,ASP.NET forum里有很多这样的问题未能解决,故写了这个解决方案,与大家分享。

问题重现:

首先,使用Response将ASP.NET页面导出为Excel或Word,代码比较简单,如下所示:

复制代码
     public   void  ExportControl(System.Web.UI.Control source, DocumentType type, string  name)
    {
        
if  (type  ==  DocumentType.Excel)
        {
            
// Excel 
            Response.AppendHeader( " Content-Disposition " " attachment;filename= " + name + " .xls " );
            Response.ContentType 
=   " application/ms-excel " ;
        }
        
else   if  (type  ==  DocumentType.Word)
        {
            
// Word 
            Response.AppendHeader( " Content-Disposition " " attachment;filename= "   +  name  +   " .doc " );
            Response.ContentType 
=   " application/ms-word " ;
        }
        Response.Charset 
=   " UTF-8 " ;
        Response.ContentEncoding 
=  System.Text.Encoding.UTF8;

        source.Page.EnableViewState 
=   false ;

        System.IO.StringWriter writer 
=   new  System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htmlWriter 
=   new  System.Web.UI.HtmlTextWriter(writer);
        source.RenderControl(htmlWriter);

        Response.Write(writer.ToString());
        Response.End();
    }

    
public   enum  DocumentType
    {
        Word,
        Excel
    }
复制代码

 

然而,在下面的例子中,我们将会得到一个令人厌烦的错误:

复制代码
<% @ Page Language="C#" EnableEventValidation = "false"   %>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >

< script  runat ="server" >

    protected 
void Button2_Click(object sender, EventArgs e)
    
{
        ExportControl(
this, DocumentType.Word, "ExportWord"); 
    }


    public override 
void VerifyRenderingInServerForm(Control control)
    
{

    }


    public 
void ExportControl(System.Web.UI.Control source, DocumentType type,string name)
    
{
        
if (type == DocumentType.Excel)
        
{
            
//Excel 
            Response.AppendHeader("Content-Disposition""attachment;filename="+name+".xls");
            Response.ContentType 
= "application/ms-excel";
        }

        
else if (type == DocumentType.Word)
        
{
            
//Word 
            Response.AppendHeader("Content-Disposition""attachment;filename=" + name + ".doc");
            Response.ContentType 
= "application/ms-word";
        }

        Response.Charset 
= "UTF-8";
        Response.ContentEncoding 
= System.Text.Encoding.UTF8;

        source.Page.EnableViewState 
= false;

        System.IO.StringWriter writer 
= new System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htmlWriter 
= new System.Web.UI.HtmlTextWriter(writer);
        source.RenderControl(htmlWriter);

        Response.Write(writer.ToString());
        Response.End();
    }


    public enum DocumentType
    
{
        Word,
        Excel
    }


</ script >

< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head  id ="Head1"  runat ="server" >
    
< title ></ title >
</ head >
< body >
    
< form  id ="form1"  runat ="server" >
    
< div >
        
< asp:ScriptManager  ID ="ScriptManager1"  runat ="server"  EnablePageMethods ="true"   />
    
</ div >
    
< asp:TextBox  ID ="TextBox1"  runat ="server" ></ asp:TextBox >
    
< ajaxToolkit:CalendarExtender  ID ="TextBox1_CalendarExtender"  runat ="server"  Enabled ="True"
        TargetControlID
="TextBox1" >
    
</ ajaxToolkit:CalendarExtender >
    
< br  />
    
< br  />
    
< br  />
    
< asp:Panel  ID ="Panel1"  runat ="server"  Height ="100px"  Width ="194px"  BackColor ="Chocolate" >
    
</ asp:Panel >
    
< ajaxToolkit:RoundedCornersExtender  ID ="Panel1_RoundedCornersExtender"  runat ="server"
        Enabled
="True"  TargetControlID ="Panel1" >
    
</ ajaxToolkit:RoundedCornersExtender >
    
< br  />
    
</ p >
    
< asp:Button  ID ="Button2"  runat ="server"  OnClick ="Button2_Click"  Text ="Download"   />
    
</ form >
</ body >
</ html >
复制代码

 

错误信息如下:

Server Error in '/AjaxControlToolkitWebSite2' Application.
--------------------------------------------------------------------------------

Extender control 'TextBox1_CalendarExtender' is not a registered extender control. Extender controls must be registered using RegisterExtenderControl() before calling RegisterScriptDescriptors().
Parameter name: extenderControl

分析:

显然,问题是出现在AJAX Extender上,如果把页面上的AJAX Extender全部删除,则工作正常。

有此,该问题的解决思路为“在导出之前移除页面上所有的Extender

 

解决方案:

使用递归方式,在导出之前移除所有AJAX Extenders:

 

复制代码
     private   void  DisableAJAXExtenders(Control parent)
    {
        
for  ( int  i  =   0 ; i  <  parent.Controls.Count; i ++ )
        {
            
if  (parent.Controls[i].GetType().ToString().IndexOf( " Extender " !=   - 1   &&  parent.Controls[i].ID  !=   null )
            {
                parent.Controls.RemoveAt(i);
                parent.Controls[i].Dispose();
            }
            
if  (parent.Controls[i].Controls.Count  >   0 )
            {
                DisableAJAXExtenders(parent.Controls[i]);
            }
        }
    }
复制代码

 

如下例所示,页面可成功导出为Word/Excel:

 

复制代码
<% @ Page Language = " C# "  EnableEventValidation  =   " false "    %>

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >

< script  runat ="server" >

    protected 
void  Button2_Click(object sender, EventArgs e)
    {
        
// DisableAJAXExtenders(this);
        ExportControl( this , DocumentType.Word,  " ExportWord " ); 
    }

    private 
void  DisableAJAXExtenders(Control parent)
    {
        
for  ( int  i  =   0 ; i  <  parent.Controls.Count; i ++ )
        {
            
if  (parent.Controls[i].GetType().ToString().IndexOf( " Extender " !=   - 1   &&  parent.Controls[i].ID  !=   null )
            {
                parent.Controls.RemoveAt(i);
                parent.Controls[i].Dispose();
            }
            
if  (parent.Controls[i].Controls.Count  >   0 )
            {
                DisableAJAXExtenders(parent.Controls[i]);
            }
        }
    }

    public override 
void  VerifyRenderingInServerForm(Control control)
    {

    }

    public 
void  ExportControl(System.Web.UI.Control source, DocumentType type,string name)
    {
        
if  (type  ==  DocumentType.Excel)
        {
            
// Excel 
            Response.AppendHeader( " Content-Disposition " " attachment;filename= " + name + " .xls " );
            Response.ContentType 
=   " application/ms-excel " ;
        }
        
else   if  (type  ==  DocumentType.Word)
        {
            
// Word 
            Response.AppendHeader( " Content-Disposition " " attachment;filename= "   +  name  +   " .doc " );
            Response.ContentType 
=   " application/ms-word " ;
        }
        Response.Charset 
=   " UTF-8 " ;
        Response.ContentEncoding 
=  System.Text.Encoding.UTF8;

        source.Page.EnableViewState 
=   false ;

        System.IO.StringWriter writer 
=   new  System.IO.StringWriter();
        System.Web.UI.HtmlTextWriter htmlWriter 
=   new  System.Web.UI.HtmlTextWriter(writer);
        source.RenderControl(htmlWriter);

        Response.Write(writer.ToString());
        Response.End();
    }

    public enum DocumentType
    {
        Word,
        Excel
    }

</ script >

< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head  id ="Head1"  runat ="server" >
    
< title ></ title >
</ head >
< body >
    
< form  id ="form1"  runat ="server" >
    
< div >
        
< asp:ScriptManager  ID ="ScriptManager1"  runat ="server"  EnablePageMethods ="true"   />
    
</ div >
    
< asp:TextBox  ID ="TextBox1"  runat ="server" ></ asp:TextBox >
    
< ajaxToolkit:CalendarExtender  ID ="TextBox1_CalendarExtender"  runat ="server"  Enabled ="True"
        TargetControlID
="TextBox1" >
    
</ ajaxToolkit:CalendarExtender >
    
< br  />
    
< br  />
    
< br  />
    
< asp:Panel  ID ="Panel1"  runat ="server"  Height ="100px"  Width ="194px"  BackColor ="Chocolate" >
    
</ asp:Panel >
    
< ajaxToolkit:RoundedCornersExtender  ID ="Panel1_RoundedCornersExtender"  runat ="server"
        Enabled
="True"  TargetControlID ="Panel1" >
    
</ ajaxToolkit:RoundedCornersExtender >
    
< br  />
    
< br  />
    
< asp:Button  ID ="Button2"  runat ="server"  OnClick ="Button2_Click"  Text ="Download"   />
    
</ form >
</ body >
</ html >
复制代码

 

PS:

一般情况下,如果想要移除页面上的所有AJAX Extender,也可以采用JavaScript的方式:

 


        function removeall() {
            
var currentBehavior = null;
            
var allBehaviors = Sys.Application.getComponents();
            
for (var loopIndex = 0; loopIndex < allBehaviors.length; loopIndex++) {
                currentBehavior 
= allBehaviors[loopIndex];
                currentBehavior.dispose();
            }
        }

 

相关Case:

http://forums.asp.net/t/1405746.aspx

http://forums.asp.net/p/1078866/2082230.aspx

http://forums.asp.net/p/1242924/2275572.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度学习tricks是指在深度学习模型训练过程中使用的一些技巧和策略,旨在提高模型的性能和训练效果。以下是一些常用的深度学习tricks: 1. 数据增强(Data Augmentation):通过对原始数据进行随机变换和扩充,生成更多的训练样本,以增加模型的泛化能力。 2. 批归一化(Batch Normalization):在每个小批量数据上进行归一化操作,有助于加速模型的收敛速度,提高模型的稳定性和泛化能力。 3. 学习率调整(Learning Rate Schedule):根据训练的进程动态地调整学习率,例如使用学习率衰减或者学习率预热等策略,以提高模型的收敛性能。 4. 正则化(Regularization):通过添加正则化项,如L1正则化或L2正则化,限制模型的复杂度,防止过拟合。 5. 提前停止(Early Stopping):在训练过程中监控验证集上的性能指标,当性能不再提升停止训练,以避免过拟合。 6. 参数初始化(Parameter Initialization):合适的参数初始化可以帮助模型更快地收敛和更好地泛化,常用的初始化方法包括Xavier初始化和He初始化等。 7. 梯度裁剪(Gradient Clipping):限制梯度的范围,防止梯度爆炸或梯度消失问题,提高模型的稳定性。 8. 集成学习(Ensemble Learning):通过结合多个模型的预测结果,可以提高模型的泛化能力和鲁棒性。 9. 迁移学习(Transfer Learning):利用已经训练好的模型在新任务上进行微调,可以加快模型的训练速度和提高模型的性能。 10. 深度网络结构设计:合理设计网络结构,包括层数、宽度、卷积核大小等,可以提高模型的表达能力和学习能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值