您的位置:首页 > 编程语言 > ASP

在aspx页面不输出input type=hidden name="__VIEWSTATE"

2007-08-02 17:18 465 查看
这是一个朋友的想法,刚开始我第一感觉是截留HtmlTextWriter的RenderBeforeTag事件
不过发现Input Type="Hidden"都不影应这个事件,郁闷
Reflector查看RegisterHiddenField发现它们都存在于一个私有成员中
最后没办法,只有使用页面过滤器了
因为是一个简单的示例,所以两个类文件写在一起了,编译后生成的dll文件名为Blackant.Controls.dll




using System;


using System.Collections.Generic;


using System.Text;


using System.Web;


using System.Web.Security;


using System.Xml;


using System.Text.RegularExpressions;


using System.IO;






namespace Blackant.Controls




...{


   




    /**//// <summary>


    /// Summary description for HiddenInputFilter


    /// </summary>


    public class HiddenInputHttpModule : IHttpModule




    ...{




     






        IHttpModule Members#region IHttpModule Members




        public void Dispose()




        ...{


            //throw new Exception("The method or operation is not implemented.");


        }




        public void Init(HttpApplication context)




        ...{


            //throw new Exception("The method or operation is not implemented.");


            context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState);


        }




        #endregion






        事件#region 事件


        void context_ReleaseRequestState(object sender, EventArgs e)




        ...{


            HttpResponse response = HttpContext.Current.Response;




            if (response.ContentType=="text/html")




            ...{


                HiddenInputFilter filter = new HiddenInputFilter(response.Filter);


                response.Filter = filter;


            }


        }


        #endregion






        IRawPath Members#region IRawPath Members


        private string _rawPath = "";


        public string GetPath()




        ...{


            return _rawPath;


        }




        #endregion


    }






 




    public class HiddenInputFilter : Stream




    ...{




        私有成员#region 私有成员


     


        Stream responseStream;


        long position;


        StringBuilder responseHtml;


        #endregion






        构造#region 构造


        public HiddenInputFilter(Stream inputStream)




        ...{


            responseStream = inputStream;


            responseHtml = new StringBuilder();


        }


        #endregion




        重写的方法#region 重写的方法


        public override bool CanRead




        ...{




            get ...{ return true; }


        }




        public override bool CanSeek




        ...{




            get ...{ return true; }


        }




        public override bool CanWrite




        ...{




            get ...{ return true; }


        }




        public override void Close()




        ...{


            responseStream.Close();


        }




        public override void Flush()




        ...{


            responseStream.Flush();


        }




        public override long Length




        ...{




            get ...{ return 0; }


        }




        public override long Position




        ...{




            get ...{ return position; }




            set ...{ position = value; }


        }




        public override long Seek(long offset, SeekOrigin origin)




        ...{


            return responseStream.Seek(offset, origin);


        }




        public override void SetLength(long length)




        ...{


            responseStream.SetLength(length);


        }




        public override int Read(byte[] buffer, int offset, int count)




        ...{


            return responseStream.Read(buffer, offset, count);


        }




        public override void Write(byte[] buffer, int offset, int count)




        ...{


            string finalHtml = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);


            //找到<input type="hidden" name="__VIEWSTATE"


            string pattern=@"<input type=""hidden"" name=""__VIEWSTATE""[^>]*>";


            finalHtml=Regex.Replace(finalHtml, pattern, string.Empty, RegexOptions.IgnoreCase | RegexOptions.Multiline);




            // Write the response


            byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(finalHtml);


            responseStream.Write(data, 0, data.Length);


        }


        #endregion


    


    }




}

然后在web项目中引用这个dll
修改web.config,加入以下内容于System.Web配置节


    <httpModules>


      <add name="HiddenInputFilter" type="Blackant.Controls.HiddenInputHttpModule,Blackant.Controls"/>


    </httpModules>

其实核心内容很简单
HiddenInputHttpModule中如下指示使用页面过滤器
 HiddenInputFilter filter = new HiddenInputFilter(response.Filter);
response.Filter = filter;
 HiddenInputFilter 中则
string finalHtml = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);
            //找到<input type="hidden" name="__VIEWSTATE"
            string pattern=@"/<input type=""hidden"" name=""__VIEWSTATE""[^/>]*/>";
            finalHtml=Regex.Replace(finalHtml, pattern, string.Empty, RegexOptions.IgnoreCase | RegexOptions.Multiline);
替换掉<input type="hidden" name="__VIEWSTATE" ..../>标签
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐