使用Firebug在具有非常大的VIEWSTATE的ASP.NET页面上查看脚本的问题

时间:2009-11-02 08:26:35

标签: asp.net firebug viewstate

我继承了一个ASP.NET应用程序,用于构建具有大量viewstate值的页面。正如我一直在研究它,我假设我能够使用Firebug检查输出并在生成的客户端脚本中设置断点。

我发现的是,只要Firebug遇到大型视图状态,它就会在渲染“脚本”选项卡时完全窒息,从而几乎无法设置和使用断点。

我在输出中看到的内容与此非常相似:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD> --snipped-- </HEAD>
<body>
    <form name="..." method="post" action="..." id="...">
    <input 
       type="hidden" 
       name="__VIEWSTATE" 
       id="__VIEWSTATE"
       value="/V4dAUdVmVyc2lvbiAzLjAsIGJ1aWxkIDMxIChlbi1VUylkAgUPFgIfAGVkAgsPDxYCHwAFC1RpbSBCb29ybWFuZGQCDw8QDxYCHgtfIURhdGFC
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD> --snipped-- </HEAD>
<body>
    <form name="..." method="post" action="..." id="...">
    <input 
       type="hidden" 
       name="__VIEWSTATE" 
       id="__VIEWSTATE"
       value="/V4dAUdVmVyc2lvbiAzLjAsIGJ1aWxkIDMxIChlbi1VUylkAgUPFgIfAGVkAgsPDxYCHwAFC1RpbSBCb29ybWFuZGQCDw8QDxYCHgtfIURhdGFC
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD> --snipped-- </HEAD>
<body>
    <form name="..." method="post" action="..." id="...">
    <input 
       type="hidden" 
       name="__VIEWSTATE" 
       id="__VIEWSTATE"
       value="/V4dAUdVmVyc2lvbiAzLjAsIGJ1aWxkIDMxIChlbi1VUylkAgUPFgIfAGVkAgsPDxYCHwAFC1RpbSBCb29ybWFuZGQCDw8QDxYCHgtfIURhdGFC

换句话说,Firebug获取viewstate值的一半,然后从顶部开始,将所有内容从DOCTYPE声明呈现到viewstate中的相同位置。

虽然我认识到(并且正在研究)这个应用程序使用viewstate的方式存在问题,但我很惊讶Firebug对输出的处理。我有Firefox和Firebug的最新版本。是否有可以更改的设置以使脚本选项卡正确呈现?有没有其他人遇到过Firebug和ASP.NET viewstate的问题?

2 个答案:

答案 0 :(得分:0)

您是否尝试过其他任何JavaScript调试工具?

我知道Chrome和Safari内置了脚本调试程序,或者有Venkman FireFox插件。

答案 1 :(得分:0)

虽然它没有解决基础ViewState问题,但我在特定页面中实现了以下解决方法,我需要使用Firebug。请注意,我不建议将SessionPageStatePersister作为最终解决方案(将这个巨大的视图状态存储在服务器上只能解决问题)但我想我会分享允许我继续前进的解决方法。

#if DEBUG
    // When debugging, it is useful to not have the large viewstate values 
    // output to the browser.
    protected override System.Web.UI.PageStatePersister PageStatePersister
    {
        get
        {
            return new SessionPageStatePersister(this);
        }
    }
#endif

这可确保我在调试时只关注我关注的输出到浏览器,但也不会更改当前的生产视图状态行为。