先上段代码
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
private static readonly Regex viewStateRegex =
new Regex("<input type=\"hidden\" name=\"__VIEWSTATE\".*/>", RegexOptions.IgnoreCase); //过滤viewstate html标记的正则表达式
private static readonly Regex endFormRegex =
new Regex(@"</form>", RegexOptions.Multiline | RegexOptions.Compiled); //过滤 </form>标记的正则表达式
//重写HTML,过滤viewstate并输出
protected override void Render(HtmlTextWriter writer)
{
System.IO.StringWriter stringWriter = new System.IO.StringWriter();
HtmlTextWriter htmlWriter = new HtmlTextWriter(stringWriter);
base.Render(htmlWriter);
string html = stringWriter.ToString();
Match viewStateMatch = viewStateRegex.Match(html);
string viewStateString = viewStateMatch.Captures[0].Value;//找出ViewState的Html标记 目的把viewstate的内容放到页面FORM的最后面加快加载速度和搜索抓录
// viewStateString = "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=\"\" />"; //仿博客园
html = html.Remove(viewStateMatch.Index, viewStateMatch.Length);//替换掉ViewState的html标记
Match endFormMath = endFormRegex.Match(html, viewStateMatch.Index);
html = html.Insert(endFormMath.Index, viewStateString);//将ViewState的Html标记插入到</form>标记之前
writer.Write(html);
}
这段代码写在你的PAGE基类里,然后看下效果就明白了,把viewstate的内容放在了最后面,这样做两个目的,第一避免VIEWSTATE过大导致页面加载速度过慢,第二避免搜索引擎访问该页面没有找到准确的信息。
现在来谈谈viewstate,我一般能不用就不用,对这个东西是深恶痛绝,看着页面出现VIEWSTATE的代码就恶心,觉得像个毒瘤。解决方案有几种
第一,禁用viewstate,在web.config里配置,然后页面传值使用form或者cookies,别用session和application他们都是服务器杀手,这种方式灵活度不高,而且微软自带的控件无法使用了,不如用JSP来做
第二,局部禁止viewstate,在页面配置,然后不能禁止的地方用我上面的代码来把viewstate放页面下方
第三,使用微软的MVC框架,很好用,不过个人感觉开发起来蛮麻烦的,不推荐也不抵触,觉得还不成熟这个东西
第四,使用ajax+web services来搞定,推荐这种方法,真正的页面代码和业务代码分离,很爽,虽然有些烦琐编码的时候,不过感觉很爽。
这就是我对viewstate的几个应对方法,有BOSS来,请指教。